我在COM方面比较新,所以如果这是一个愚蠢的问题,那就很有用了。我有一堆COM接口编译成类型库 A 。此类型库是我的解决方案中的一个DLL( a.dll )中的资源。在一个单独的类型库( B )中,它进入一个单独的DLL( b.dll )我想定义一个实现类型库的接口的coclass A 的。请参阅下面的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;
};
};
我可以编译上面的确定,但是当我在oleview中打开MIDL生成的tlb文件时,收到错误消息TYPE_E_CANTLOADLIBRARY
。我开始怀疑我想做什么是不可能的。到目前为止,我的实验表明类型库需要包含coclass实现的所有接口以及coclass定义本身。这是真的吗?
如果删除importlib("MyLibA.tlb);
语句,我可以在oleview中查看已编译的tlb文件而不会出现错误,但 MyLibB.tlb 还包含IMyInterface
接口的定义,即在两个类型库中定义接口两次。我不希望这样,因为在我的应用程序中,我使用免注册COM加载 a.dll 和 b.dll 。在这种情况下,激活上下文生成在多个类型库中遇到相同的接口定义时会失败。
有关如何在单独的类型库中实现所需接口和coclass分离的任何建议吗?
答案 0 :(得分:3)
当OLE / COM查看器显示TYPE_E_CANTLOADLIBRARY
时,这通常意味着正在打开的另一个TLB未正确注册。
修复方法是使用regtlb
或regtlib
之类的工具或替代方案注册依赖关系TLB(在本例中为MyLibA.tlb),具体取决于您的系统。
由于问题是在无注册COM的上下文中给出的,因此您应该了解关于接口实例的编组的可能问题。通常,必须注册TLB才能使用标准编组器。否则,您必须确保在清单中正确声明封送信息,如上所述here