问题标签 [idispatch]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2829 浏览

dynamic - CWnd 作为 C++ 中没有 .dll 或 .ocx 文件的 ActiveX 控件?

亲爱的 MFC/ActiveX/COM 破解,我已经“继承”了一个旧的 MFC 应用程序(最初使用 Visual Studio 6 创建)的源代码,它在 VS 2010 中构建和运行,但嵌入了一些 ActiveX 控件作为源代码,显然是生成的通过 Visual Studio 向导(.h 和 .cpp 文件,见下文);但是不在自己的子项目中,以便生成 .dll 或 .ocx 文件。以下是此类控件的头文件的相关部分:

请注意,此类继承自 CWnd 而不是某些 OCX 类。但由于所有 MFC 窗口都是 COM 组件(正如我在某处读到的那样),而且这是生成的代码,它应该在一段时间前就可以工作了。我还读到这可能是 2005 年之前发生的迁移差距。还要注意 DECLARE_DYNCREATE,所以我认为这是后期绑定,使用 IDispatch 接口。所以 MFC 会为我们调用一个 Create() 函数。

上述控件通过包含 CDialog 的聚合使用(也使用 VS 向导创建):

反过来,对话框嵌入在应用程序的视图类中(同样,通过成员变量),并通过在菜单项事件处理程序中调用 DoModal() 来创建。

因此,当我单击相应的菜单项时,我会得到一个 m_hWnd NULL 断言,并且在弹出的对话框中点击“重试”时,会出现以下堆栈(摘录):

在 VS 调试输出中有以下几行:

因此,显然对 CoCreateInstance 的调用已经完成,并且在没有断言的情况下默默地失败了,这本来是很好的。有人知道这是哪里吗?

我的核心问题是,在这种情况下,即使控件不在 .dll 或 .ocx 项目中,MFC 通常会注意注册控件是否正确,并且它过去一定是这样工作的。我在某处读到,带有 DialogTemplate 的 CreateDlgIndirect 是一种无需 .dll 或 .ocx 文件即可创建 ActiveX 控件的方法。在上面的堆栈中,它也被调用,但不是为 ActiveX 控件,而是为对话。

有谁知道更多关于这个问题以及如何解决它?如果我必须手动注册控件,例如使用 regsvr32.exe 或通过源代码,有没有没有 .dll 或 .ocx 文件的方法?或者我是否必须在他们自己的项目中重新打包 ActiveX 组件(无论如何,还有什么是基于组件/模块化的)?

我希望我的问题描述足够准确,我会非常感谢任何答案。亲切的问候。

0 投票
2 回答
8126 浏览

c# - 在 C# 中实现 IDispatch

我正在编写一些测试代码来模拟调用我的后期绑定 COM 对象的 c# 实现的非托管代码。我有一个声明为 IDispatch 类型的接口,如下所示。

当我使用下面的代码调用 IDispatch 的GetIDsOfNames函数时

其中 IDispatch 定义为:

抛出 InvalidCastException。是否可以将 ac# 接口转换为 IDispatch?

0 投票
2 回答
447 浏览

com - 为什么我在 2 个不同的实例中得到相同的 __vfptr?

我对通过 IDispatch/IUnknown 指针看到的 __vfptr 感到困惑。我正在创建进程内免费线程 COM obj (IMyContainer)。在这个对象中,我需要保留指向实现相同 IMyInterface 的 com 对象的 2 个不同实例的指针。所以我两次调用 CreateAndSaveDispToMap()。

我的想法是将他们的 IDispatch 指针保存在一些 std::map 中。此时我怀疑每个实例的 refCount 都为 1。事实就是如此。但令人惊讶的是,我发现我通过 pUnk 获得了相同的 __vftbl 以获取 2 个不同的调度指针。

为什么?AddRef() 和 Release() 怎么可能正常工作?

0 投票
2 回答
1023 浏览

c++ - 使用 C++ 进行 OLE 自动化:从 Invoke() 接收空变量而不是有效结果

在 C++ 中,我试图调用如下所示的 OLE 方法:

我使用以下代码来调用它(改编自http://www.codeproject.com/KB/office/MSOfficeAuto.aspx):

该程序在没有崩溃的情况下执行,并且我收到了monoId输出 BSTR* pvResult(并且我得到了我期望的值)。但是我没有找到名字,我只得到一个空的变体dp:rgvarg[0],即在我的终端上我看到

. 当我从 LabView 调用它时,完全相同的方法工作正常,所以我认为问题出在我的代码中。如何恢复名称输出?

0 投票
1 回答
1628 浏览

delphi - TEventObject 和 WebBrowser

我创建了一个TEventObject提供OnMouseDownOnMouseMove事件TWebBrowser。这些事件在移动鼠标和单击 webbrowser 时完美运行,但是当我滚动或单击 webbrowser 的垂直滚动条时发生EZeroDivide异常。EurekaLog 报告 d2d1.dll 中的 EZeroDivide 异常。我试图捕获异常,但我尝试过的任何方法似乎都不起作用:

我的问题是我可以以某种方式防止异常,还是可以检测到 TWebbrowser 垂直滚动条上的 mousedown 以防止异常?这个异常对我来说是一个很难解决的问题,因为我对 TEventObject 了解不多,也不明白为什么只有在单击或拖动垂直滚动条时才会出现异常。如果需要,我可以提供更多信息。编译器:德尔福 2010。

[编辑] 见这篇文章: http: //www.codenewsfast.com/cnf/article/0/waArticleBookmark.7401953 一个非常简单的演示应用程序位于: http ://dl.dropbox.com/u/2167512/bugs /ie9/ie9_bug.zip

这可以防止错误:

0 投票
2 回答
916 浏览

delphi - 将接口传递给不同的进程

我使用WM_COPYDATA来启用我的两个进程A和B之间的通信。与基本数据类型交换数据没有问题。

现在我有一个问题,在某些情况下,我想将一个接口(IDispatch)从我的进程 A 传递给我的进程 B。这可能吗?

0 投票
2 回答
902 浏览

python - 没有类型库的python IDispatch客户端

我正在尝试与 Python 一起使用只公开 IDispatch 接口并且既没有 IDL 文件也没有类型库的 COM 服务器。我确实有关于不同方法以及如何使用它们的文档。

尝试使用 win32com 包对我来说失败了,因为似乎当没有可用的类型信息时 win32com 回退到假设任何属性访问是属性获取或设置,而不是方法调用。

也就是说,当我执行以下操作时:

win32com 尝试获取服务器上的someServerMethod属性,完全忽略 arg1、arg2。挖掘代码似乎是因为 python 正在调用没有 arg1、arg2 的 self.__getattr__。

我正在寻找解决此问题的方法:

  • 一些语法告诉 win32com 我实际上是在调用一个方法;
  • 其他一些实际实现此行为的python COM客户端;
  • 其他建议,除了明显的“手动将文档转换为类型库”。

谢谢!

0 投票
2 回答
2646 浏览

c++ - 继承接口 & IUnknown , IDispatch 方法定义

我需要继承具有抽象方法的接口,在 VB/c# 中,我们只需覆盖接口中的方法,而无需为 IUnknown 或 IDispatch 方法编写代码

但是在c ++中,在类中继承接口并在接口中覆盖方法之后,当我尝试实例化派生类时,出现以下错误

所以我需要覆盖/定义 IUnknown 和 IDispatch 方法,例如 addref、Release、QueryInterface、invoke、gettypeinfo

由于它们似乎是标准函数,我在哪里可以获得它们的代码/定义,例如 ATL 或任何类型库?或任何我可以获得上述方法的代码/示例的参考资料

0 投票
0 回答
378 浏览

c# - 时间:2019-04-10 标签:c#marshalingidispatchpointer

在我的代码调用的非托管 IDispatch 接口中,其中一个功能是

要调用它,我正在尝试:

显然这行不通。有人对如何将我的对象编组为 IDispatch 指针有任何建议吗?

谢谢

0 投票
1 回答
553 浏览

c# - 了解 COM/WSH 行为 - 后期绑定的 IDispatch _Default 和 Item?

我试图复制我在 C# 中的 JScript 中观察到的行为。我正在使用 IDispatch 枚举成员并在后期绑定对象上调用它们。我是一个完整的 C++ 菜鸟,并且对 COM 的了解足够多,以至于非常危险。这是我的问题:

  • DISPID_VALUE 是否始终为零 (0)?(似乎是的)
  • 调用 COM 对象时,我应该何时调用 DISPID_VALUE 成员?(例如,当接口本身被索引或调用时......?)
  • 何时调用 .Item 是否有任何规则/提示?
  • 为什么在下面的示例中,BindingFlags.SetProperty 对 .Cells(x, x) 起作用(而不是 BindingFlags.InvokeMethod)?它是在调用 _Default(x, x) 吗?项目(x,x)?它怎么知道这样做?我怎样才能知道它在调用哪个?
  • 是否有一些关于调用后期绑定的 IDispatch COM 对象的好文档?

在下面的示例中,Excel 电子表格的单元格 1,1 将值设置为某些文本并“加粗”。

考虑以下 WSH JScript:

此 C# 代码创建相同的结果(是的,抱歉,它非常冗长):

当我有时间时,我计划尝试并了解更多有关此内容的一种方法是让 JScript 调用我将使用日志记录/调试创建的 C# COM 类。