【发布时间】:2013-02-26 19:57:49
【问题描述】:
我在 COM 方面相对较新,所以如果这是一个愚蠢的问题,请原谅。我将一堆 COM 接口编译到类型库 A 中。此类型库是我的解决方案中的一个 DLL (a.dll) 中的资源。在进入单独 DLL (b.dll) 的单独类型库 (B) 中,我想定义一个实现类型库 接口的 coclass一个。请参阅下面的 IDL 代码作为我想到的简化示例:
import "oaidl.idl";
import "ocidl.idl";
// Import IMyInterface, which is part of MyLibA.tlb
import "MyInterface.idl";
[
uuid(E80492A8-1E8C-4ABF-B4DE-9C252C445AFE),
version(1.0),
helpstring("MyLibB Type Library")
]
library MyLibB
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
importlib("MyLibA.tlb);
[
uuid(25E3CD5E-FA06-4845-BE3E-F260985AFB20),
helpstring("My CoClass")
]
coclass MyCoClass
{
[default] interface IMyInterface;
};
};
我可以编译上面的ok,但是当我在oleview中打开MIDL生成的tlb文件时,我得到一个错误信息TYPE_E_CANTLOADLIBRARY。我开始怀疑我想做的事情是不可能的。到目前为止,我的实验表明,类型库需要包含 coclass 实现的所有接口以及 coclass 定义本身。这是真的吗?
如果我去掉importlib("MyLibA.tlb);语句,我可以在oleview中查看编译的tlb文件没有错误,但是MyLibB.tlb那么还包含IMyInterface接口的定义,即接口在两个类型库中都定义了两次。我不希望这样,因为在我的应用程序中,我使用免注册 COM 加载了 a.dll 和 b.dll。在这种情况下,当在多个类型库中遇到相同的接口定义时,激活上下文生成会失败。
有什么建议可以在不同的类型库中实现所需的接口和 coclass 分离?
【问题讨论】:
-
谢谢,成功了,我现在可以在 OLEView 中查看 MyLibB.tlb 的 tlb。我没有注册 MyLibA.tlb 的原因是因为我使用的是免注册 COM。
-
我已删除评论并将其添加为答案,以防其他人发现它有用。