2

我在 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 失败,因为“没有这样的支持接口”。

请帮忙。有什么问题?如果您需要任何其他信息,我会尽量提供。

4

1 回答 1

2

您需要构建和注册代理/存根 DLL。跨进程边界编组接口所必需的。我找不到一个很棒的 MSDN 页面,但这里提到了

于 2010-12-01T13:06:07.200 回答