COM类从另一个类型库实现接口

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

我在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 "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未注册。