从 TLB 导入的接口上的进程外 COM 服务器的 QueryInterface
我在 A.idl 文件中定义接口,并将其编译为 A.tlb
在 VS2005 ATL 项目“B”中,我在 B.idl 中使用 importlib(A.tlb) 并在 stdafx.h 中使用 #import "A.tlb"并在 ATL COM 类中实现来自 A.tlb 的接口 IA。该项目输出一个 B.dll 和一个 B.tlb,
我将 B.tlb 添加到 C# 应用程序的引用中,并在代码中实例化 COM 对象。
两者都工作正常,则实例化工作没有问题
Type.GetTypeFromCLSID(); Activator.CreateInstance(...);
如果我使用其中一个或
[DllImport("ole32.dll", ...)] CoCreateInstance(...)
,对象实例化并且我可以将其转换为A.tlb中定义的IA接口(实际上是从tlb生成的RCW)并调用其方法。仍然没有问题。
然后,我使用 OLEView 使用默认的 DllHost.exe 代理来启用 COM 对象激活。
COM 对象在代理中的实例化(CoCreateInstance 中的参数 CLSCTX_LOCAL_SERVER)仍然没有问题,但是当我尝试将对象转换为 A.tlb 中定义的 IA 接口时,我得到 E_NOINTERFACE 并显示一条消息,指出 QueryInterface 失败,因为“不支持此类接口”。
请帮忙。可能出什么问题了?如果您需要任何其他信息,我会尽力提供。
I define my interfaces in an A.idl file, which I compile to A.tlb
In a VS2005 ATL project "B" I use importlib(A.tlb) in B.idl and #import "A.tlb" in stdafx.h and implement an interface IA from A.tlb in an ATL COM class. The project outputs a B.dll and a B.tlb
I add the B.tlb to refererences of a C# application and within the code I instantiate the COM object.
The instantiation works without problems if I use either
Type.GetTypeFromCLSID(); Activator.CreateInstance(...);
or
[DllImport("ole32.dll", ...)] CoCreateInstance(...)
Both work fine, the object instantiates and I can cast it to IA interface defined in A.tlb (actually a RCW generated from the tlb) and invoke its methods. Still no problems.
Then I use OLEView to enable the COM object activation using the default DllHost.exe surrogate.
The instantiation of the COM object within the surrogate (parameter CLSCTX_LOCAL_SERVER in CoCreateInstance) is still without problems, but when I try to cast the object to the IA interface defined in A.tlb I get E_NOINTERFACE and a message saying QueryInterface failed because "No such interface supported".
Please help. What could be wrong? If you need any additional info, I'll try to provide as much as possible.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您需要构建并注册代理/存根 DLL。需要跨进程边界编组接口。我找不到一个很好的 MSDN 页面,但它是
You need to build and register the proxy/stub DLL. Required to marshal the interfaces across process boundaries. I can't find a great MSDN page for it, but it is mentioned here.