从TLB导入的接口上的进程外COM服务器的QueryInterface

时间:2010-12-01 12:34:10

标签: com atl idl typelib

我在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对象激活。

在代理(CoCreateInstance中的参数CLSCTX_LOCAL_SERVER)中COM对象的实例化仍然没有问题,但是当我尝试将对象强制转换为A.tlb中定义的IA接口时我收到E_NOINTERFACE ,并显示一条消息,说QueryInterface失败,因为“没有支持这样的接口”。

请帮忙。可能有什么不对?如果您需要任何其他信息,我会尝试提供尽可能多的信息。

1 个答案:

答案 0 :(得分:2)

您需要构建并注册代理/存根DLL。需要跨进程边界封送接口。我找不到一个很棒的MSDN页面,但它是mentioned here