问题标签 [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.
com - COM 是否支持多个双接口?
我制作了一个具有多个双接口的 COM 对象。它适用于早期版本的编译器,但不适用于当前版本。
我的问题:COM 规范是否说这应该有效(因此我应该报告编译器错误),还是不应该有效?此页面表明它可能并不适用。
RIDL 文件:
访问它的代码(这是伪代码,我在“真实”代码中有额外的语句来显示HRESULT
s):
所以,问题在于它的ibar
行为与intf
. ibar
本来可以foo_method
叫它的,但好像不知道是什么东西bar_method
。
我期待第二个GetIDsOfNames
电话给0
,然后 Invoke 能够打电话bar_method
,第三个 GetIDsOfNames 应该给0x80020006
。
关于编译器的额外信息(虽然,需要明确的是,我的问题是 COM 规范是否说它应该工作):在 BDS 2006 中有效,在 C++Builder XE5 中无效。我浏览了实现 COM 的 XE5 中的代码,并且 ojbect 工厂在第一次创建对象时填充了一个ITypeInfo *
using ,但随后的实现对所有结果都使用相同的,它不再使用 new调用。那是在.GetTypeInfoOfGUID(CLSID_....)
QueryInterface
ITypeInfo
GetTypeInfoOfGUID
IID
ITypeInfo
DispGetIDsOfNames
IDispatch::GetIDsOfNames
c++ - c++ MFC SDI DLL调用OLE Server使用IDispatch的方法
我已经编写了一个 c++ MFC DLL,它提供了一个 SDI 应用程序,它是一个非常旧的 OLE 服务器。(我没有选择使用这个 OLE 服务器,所以我必须让它工作。)
我正在从 C# 访问这个 c++ DLL。
我有一切“工作”。我可以调用 DLL 的方法,我已经正确实现了 C# 委托,等等。
我可以直接在 C++ 中调用 OLE 服务器的方法并导出这些方法,以便我的 C# 应用程序调用也调用它们。这是我的“Hello World”,用于从 C# 访问 OLE 服务器的全部功能。
到目前为止,一切都很好。
下一步是使这个 C++ DLL 尽可能多地成为“传递”,以便 C# 开发人员可以围绕这个 OLE 服务器编写业务逻辑。如果 OLE 服务器的制造商发生更改或更新,我们不想更新 C++ 代码,我们希望响应 C# 中的更改。
因此,即使我可以使用从 OLEServer.tlb 文件中导入的类在 C++ 中实现方法并将这些方法传递给 C#,我们最终也不希望这样做。我试图通过 IDispatch 接口调用方法,但我遇到了我不太理解的困难。
我将 Visual Studio 2010 用于非托管 C++ 和 C#。
上面的以下行给了我一个“错误的变量类型”错误:
顺便说一句,我确信代码可以大大改进,自从我用 C++ 编写以来已经有好几年了,这只是让它工作的“第一步”,所以没有真正的错误处理等。
我玩弄了“Args []”类型和值,其中包含“类型不匹配”错误和“空引用指针”的变体
.tlb 文件导入的函数如下所示:
哦,虽然我将“pMethodNameAndParamsInReverseOrder”作为参数传递,但我只是对其进行硬编码以使这个简单的方法起作用。一旦我使用了这个和其他一些方法,我计划让这个通用来处理 COM 接口通过 IDispatch 实现的任何方法。
任何帮助将不胜感激,主要是为了让这个工作,但我也很感激任何关于改进代码的指针,我有很多东西要在 C++ 中学习
谢谢你!
顺便说一句,如果这有助于澄清事情,那么 App.pTriadView->pTriadItem->Catalog 是我正在实现的 COM 类
编辑:
感谢@HansPassant(见第一条评论)我明白了我错过了什么。不幸的是,我遇到了修复该问题的下游结果。VARIANT“pResult”返回为空。我现在将继续追捕,但欢迎任何想法:)
vba - ATL 创建的 COM 接口继承了 IDispatch 但后期绑定不起作用
这是我的 IDL 文件。IFrame 是双接口,同时继承了 IDispatch 和 IUnknown。
这是假设实现 IFrame 的 CFrame 类声明:
COM 服务器已注册,当我在 VBA 中使用 Frame 对象但通过早期绑定时它工作正常。我想将此对象与 VBScript 一起使用,所以我确实需要后期绑定。
但是不能进行后期绑定。我了解了情况,似乎 ATL(和 IDispatchImp 类)完成了 IDispatch 所需的所有实现,这使我能够使用自动化工具(例如 VBScript)来使用对象。
但是,在实践中,脚本会给出“无法创建 Active X 控件”错误。当我尝试早期绑定时,在 VBA 中也是如此。
我究竟做错了什么?我在 Windows 7 64 位上使用 Visual Studio 2012,但我的 COM 服务器是 32 位的(并且已在系统中注册)。
c++ - 如何使用所需的 BSTR* 参数正确调用 IDispatch::Invoke
有许多关于如何使用 BSTR* 参数调用 IDispatch::Invoke 的示例。我有这个与许多其他“SomeType *”参数一起使用,但无论我尝试什么,我都会得到类型不匹配的 HRESULT、E_OUTOFMEMORY 或访问冲突。在我看来,我在记忆方面做错了,但我正在遵循我发现的不同示例......作为旁注,最终的“[out] UINT puArgErr”参数永远不会填充导致参数索引问题。但是,我知道这是 BSTR 类型的第三个参数(我已经成功调用了另一个方法,它采用了前面的两个参数。)
*
*
*
我不明白为什么当我关注 BTR* 参数的其他示例时会发生这种情况……此外,我还有许多其他成功调用 IDispatch::Invoke 的方法,但是这个 BTR* 让我停了下来。
绝望,请帮助!
添加:
IDL 为:[id(0x00000171)] short GetCategory(short nIndx, short* nCat, BSTR* bszName);
c++ - DLL 线程回调工作正常,但在回调调用 InvokeHelper 时会导致访问冲突
我创建了一个 DLL,它启动一个轮询 USB 设备的线程,当 DLL 从 USB 设备获取消息时,它调用回调函数。
在代码中使用此 dll 包括从 DLL 创建类的实例,然后调用所述类的方法来设置回调函数,然后启动线程,以便每次 USB 设备执行某些操作时都会发生回调,线程有效,回调发生(它是一个键盘设备,所以它只是以 LPCSTR 的形式发送按键)但是当我将此按键值传递给内部函数时,它会导致访问冲突。与其他任何使用相同值调用此函数的方法一样,工作正常。
这是导致访问冲突的行
包含功能:
DLL 设置回调:
DLL 启动线程:
DLL 消息线程:
c# - “COM 目标未实现 IDispatch”异常
我是 COM 编程的新手,解决方案可能很简单,但我做不到。我的 COM 客户端代码在早期绑定中运行良好。后期绑定问题。
客户端代码:使用 .net 4.0 框架
实际obj.InvokeMember 抛出“COM 目标不实现IDispatch”异常。
IDL 文件:
请建议我的代码出了什么问题?
谢谢,帕万
c# - Com 接口类型为 IDispatch 时的默认属性
在 ac# com 接口中,可以像这样定义一个默认成员
使用 IDispatch(或双重)一切都按预期工作,从 VBA 我可以省略这样的属性
但是如果我只将接口定义为 IUnknown,它就不起作用。在 excel 对象浏览器中,我仍然看到标有“蓝点”并标记为“默认成员”的属性。但是 .Item 必须在 VBA 代码中明确指定。
有没有办法让 IUnknown 中的默认属性表现得像 IDispatch 中一样?
winapi - 检索传出调度接口成员的 DISPID
我坚持这个。
给定三个变量:
- 一个
IDispatch*
可连接的对象 - 该
IID
对象上的传出调度接口的 (DIID) - 分配接口定义的成员的名称
如何将名称解析为 DISPID?
pDispatch->GetIDsOfNames(...)
ReturnsDISP_E_UNKNOWNNAME
,正如我所料(传出接口不是由可连接对象实现的)- 我需要支持 0 个客户端尚未连接到传出接口的场景,因此我无法枚举现有连接点以调用
GetIDsOfNames
其中一个(我什至不确定这是否可行) - 为了执行手动反射,我需要 dispinterface 的
ITypeInfo
. 我可以从 coclass 的ITypeInfo
. 但是pDispatch->GetTypeInfo(0, ...)
返回ITypeInfo
实现IDispatch
(根据文档),而不是ITypeInfo
coclass。ITypeInfo
(并且这个对象的实现没有暴露其他sIDispatch
。)
java - 如何为 BSTR* 调用 OleAutomation 对象方法?
这是我从类型库中获得的 IDispatch 接口:
这是我的java代码:
输出是:
可执行文件打开,但它没有做我想要的,你可以看到它失败了,我认为它与name
and rgdispidNamedArgs
.
这是一个有效的 Perl 等价物:
我第一次在 Java 中使用 OleAutomation 并且没有太多经验,也可以在互联网上找到很少的示例,我尝试转换我为我的项目找到的示例,但示例是BSTR而不是BSTR*,在我看来,这是唯一的区别,它不起作用,我不知道为什么。CallSet 方法用于各种设置/调用,例如 20-30,但我对"Call_setCallDistance"特别感兴趣。如果你能伸出援手,我会很高兴!
c++ - 如何创建 COM IDispatch 指针并将其作为回调从 C++ 控制台客户端成功传递到 C++ WinService?
提前对太长的帖子表示抱歉,但考虑到涉及的部分很多,我不确定我会在哪里犯错,因此,我需要发布所有涉及的部分。请不要假设任何事情,我可能会在这里犯任何类型的错误。
问题:
1)真正的问题:刚刚学习COM。
2) 我需要将 IDispatch 指针从 C++ 中的控制台客户端 ( ConsoleClient ) 作为参数传递给 Windows 服务 ( WinService ) 中的 COM 函数。此 IDispatch 指针充当回调。WinService 知道要调用的函数的名称。我所有的尝试都没有成功。我收到不同的错误,例如:未实现、RPC 不可用等。
注意:以下错误是正确的!我在@Igor 指出我的错误后进行了编辑:在 STA 线程中有一个 do-while(我从 main() 中删除)。我在 main() 线程(而不是 do-while)中添加了一个消息泵(GetMessage、TranslateMessage 和 DispatchMessage),我的问题得到了解决!
我有一个 WinService 公开以下 COM 接口(WinService 的 idl 文件):
WinService 内部期望vCallBack .vt = VT_DISPATCH,即当我从 ConsoleClient.EXE 应用程序调用 WinServiceCOM 函数时需要传入的回调指针。WinService 知道充当回调的函数的名称。即,WinService 从IDispatch-pointer-callback GetIDsOfName 调用以“ FunctionCallback ”作为参数。但是,在这里我在 WinService 中遇到不同的错误,例如:未实现,RPC 不可用等。然后没有执行回调(ConsoleClient 没有收到任何返回)。
到目前为止我所做的(以下所有源代码都在 ConsoleClient.EXE 中找到)ConsoleClient.EXE main.cpp:
所有主要的都成功执行。但是,我从来没有从回调中得到任何东西。当 WinService 尝试从 IDispatch 指针回调中查询接口时,它会抛出以下错误:未实现,RPC 不可用,等等......
创建 ConsoleClient IDispatch 接口的模板类来自:http: //blogs.msdn.com/b/oldnewthing/archive/2013/06/12/10425215.aspx
disInterfaceBase.h:
ConsoleClient ConsoleClient.h 中的实际 IDispatch 实现
和 ConsoleClient.idl
我创造了:
我还使用 regtlibv12.exe 注册了 tlb
很抱歉这篇文章太长了,但是 COM 强迫我这样做,特别是我是 COM 的新手,我不知道我会在哪里犯错。
注意:我确信调用(从 ConsoleClient.EXE)到 WinService COM 函数(WinServiceCOMfunction)是成功的(我调试了它并在调用之后点击了这个函数)。
NOTE2:我确信使用回调的 WinService 有效。还有其他实现(在不同的编程语言中)通过 WinService 中的相同功能(WinServiceCOMfunction)使用此机制。
有什么帮助吗?提前致谢!