问题标签 [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.
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 组件(无论如何,还有什么是基于组件/模块化的)?
我希望我的问题描述足够准确,我会非常感谢任何答案。亲切的问候。
c# - 在 C# 中实现 IDispatch
我正在编写一些测试代码来模拟调用我的后期绑定 COM 对象的 c# 实现的非托管代码。我有一个声明为 IDispatch 类型的接口,如下所示。
当我使用下面的代码调用 IDispatch 的GetIDsOfNames
函数时
其中 IDispatch 定义为:
抛出 InvalidCastException。是否可以将 ac# 接口转换为 IDispatch?
com - 为什么我在 2 个不同的实例中得到相同的 __vfptr?
我对通过 IDispatch/IUnknown 指针看到的 __vfptr 感到困惑。我正在创建进程内免费线程 COM obj (IMyContainer)。在这个对象中,我需要保留指向实现相同 IMyInterface 的 com 对象的 2 个不同实例的指针。所以我两次调用 CreateAndSaveDispToMap()。
我的想法是将他们的 IDispatch 指针保存在一些 std::map 中。此时我怀疑每个实例的 refCount 都为 1。事实就是如此。但令人惊讶的是,我发现我通过 pUnk 获得了相同的 __vftbl 以获取 2 个不同的调度指针。
为什么?AddRef() 和 Release() 怎么可能正常工作?
c++ - 使用 C++ 进行 OLE 自动化:从 Invoke() 接收空变量而不是有效结果
在 C++ 中,我试图调用如下所示的 OLE 方法:
我使用以下代码来调用它(改编自http://www.codeproject.com/KB/office/MSOfficeAuto.aspx):
该程序在没有崩溃的情况下执行,并且我收到了monoId输出 BSTR* pvResult
(并且我得到了我期望的值)。但是我没有找到名字,我只得到一个空的变体dp:rgvarg[0]
,即在我的终端上我看到
. 当我从 LabView 调用它时,完全相同的方法工作正常,所以我认为问题出在我的代码中。如何恢复名称输出?
delphi - TEventObject 和 WebBrowser
我创建了一个TEventObject
提供OnMouseDown
和OnMouseMove
事件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
这可以防止错误:
delphi - 将接口传递给不同的进程
我使用WM_COPYDATA来启用我的两个进程A和B之间的通信。与基本数据类型交换数据没有问题。
现在我有一个问题,在某些情况下,我想将一个接口(IDispatch)从我的进程 A 传递给我的进程 B。这可能吗?
python - 没有类型库的python IDispatch客户端
我正在尝试与 Python 一起使用只公开 IDispatch 接口并且既没有 IDL 文件也没有类型库的 COM 服务器。我确实有关于不同方法以及如何使用它们的文档。
尝试使用 win32com 包对我来说失败了,因为似乎当没有可用的类型信息时 win32com 回退到假设任何属性访问是属性获取或设置,而不是方法调用。
也就是说,当我执行以下操作时:
win32com 尝试获取服务器上的someServerMethod属性,完全忽略 arg1、arg2。挖掘代码似乎是因为 python 正在调用没有 arg1、arg2 的 self.__getattr__。
我正在寻找解决此问题的方法:
- 一些语法告诉 win32com 我实际上是在调用一个方法;
- 其他一些实际实现此行为的python COM客户端;
- 其他建议,除了明显的“手动将文档转换为类型库”。
谢谢!
c++ - 继承接口 & IUnknown , IDispatch 方法定义
我需要继承具有抽象方法的接口,在 VB/c# 中,我们只需覆盖接口中的方法,而无需为 IUnknown 或 IDispatch 方法编写代码
但是在c ++中,在类中继承接口并在接口中覆盖方法之后,当我尝试实例化派生类时,出现以下错误
所以我需要覆盖/定义 IUnknown 和 IDispatch 方法,例如 addref、Release、QueryInterface、invoke、gettypeinfo
由于它们似乎是标准函数,我在哪里可以获得它们的代码/定义,例如 ATL 或任何类型库?或任何我可以获得上述方法的代码/示例的参考资料
c# - 时间:2019-04-10 标签:c#marshalingidispatchpointer
在我的代码调用的非托管 IDispatch 接口中,其中一个功能是
要调用它,我正在尝试:
显然这行不通。有人对如何将我的对象编组为 IDispatch 指针有任何建议吗?
谢谢
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 类。