COM类从另一个类型库实现接口
我在COM方面比较新,所以如果这是一个愚蠢的问题,我会任命。我正在将一组COM接口编译成一个类型库a。这个类型库是我的解决方案中的一个dll(a.dll)中的一个资源。在进入单独DLL(B.DLL)的单独类型库(B)中,我想定义一个实现类型库a接口的类。请参阅下面的IDL代码,作为我想到的简化示例:COM类从另一个类型库实现接口,com,idl,midl,coclass,Com,Idl,Midl,Coclass,我在COM方面比较新,所以如果这是一个愚蠢的问题,我会任命。我正在将一组COM接口编译成一个类型库a。这个类型库是我的解决方案中的一个dll(a.dll)中的一个资源。在进入单独DLL(B.DLL)的单独类型库(B)中,我想定义一个实现类型库a接口的类。请参阅下面的IDL代码,作为我想到的简化示例: import "oaidl.idl"; import "ocidl.idl"; // Import IMyInterface, which is part of MyLibA.tlb import
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\u E\u CANTLOADLIBRARY
。我开始怀疑我想做的是不可能的。到目前为止,我的实验表明类型库需要包含coclass实现的所有接口以及coclass定义本身。这是真的吗
如果我删除importlib(“MyLibA.tlb”);
语句,我可以在oleview中查看编译好的tlb文件,但MyLibB.tlb还包含IMyInterface
接口的定义,即该接口在两个类型库中都定义了两次。我不希望这样,因为在我的应用程序中,我使用无注册COM加载a.dll和b.dllo、 当在多个类型库中遇到相同的接口定义时,激活上下文生成失败
有没有建议如何在单独的类型库中实现所需的接口和类分离?当OLE/COM viewer显示
类型库时,这通常意味着从正在打开的TLB引用的另一个TLB未正确注册
修复方法是使用regtlb
或regtlib
或其他工具注册依赖项TLB(在本例中为MyLibA.TLB),具体取决于您的系统
由于该问题是在免注册COM的上下文中给出的,因此您应该了解有关封送接口实例的可能问题。通常,必须注册TLB才能使用标准封送器。否则,您必须确保在清单中正确声明封送信息,如前所述谢谢经过工作,我现在可以在OLEView中查看MyLibB.tlb的tlb。我没有注册MyLibA.tlb的原因是因为我使用的是免费注册的COM。我已经删除了注释,并将其添加为一个答案,以防其他人发现它有用。是的,我认为tlb有点损坏,因为OLEView不会打开它,但那是因为MyLibA.tlb没有打开已注册。我确认,在我的免注册COM场景中,我可以在不注册任何tlb的情况下使用我的coclass,我只需要注册OLEView。我在答案中添加了一个注释,因为您可能会遇到封送问题,因为tlb未注册。