我在 COM 中相对较新,所以如果这是一个愚蠢的问题,我很抱歉。我将一堆 COM 接口编译到类型库A中。此类型库是我的解决方案中的一个 DLL ( a.dll ) 中的资源。在进入单独 DLL ( b.dll )的单独类型库 ( B ) 中,我想定义一个实现类型库A接口的 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 分离吗?