我在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。在此场景中,激活上下文生成在多个类型库中遇到相同的接口定义时会失败。
有什么建议吗?如何在不同类型的库中实现所需的接口和同级分离?
发布于 2013-03-11 16:48:38
当OLE/COM查看器显示TYPE_E_CANTLOADLIBRARY时,这通常意味着从打开的TLB引用的另一个TLB没有正确注册。
解决方法是根据系统的不同,将依赖项TLB (在本例中为MyLibA.tlb)注册到regtlb、regtlib或alternative之类的工具中。
由于这个问题是在无注册COM的上下文中提出的,因此您应该注意到与接口实例的封送处理有关的可能问题。通常,必须注册TLB才能使用标准封送器。否则,您必须确保在清单中正确声明封送处理信息,如前面提到的这里。
https://stackoverflow.com/questions/15342012
复制相似问题