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

时间:2013-03-11 15:08:33

标签: com idl midl coclass

我在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分离的任何建议吗?

1 个答案:

答案 0 :(得分:3)

当OLE / COM查看器显示TYPE_E_CANTLOADLIBRARY时,这通常意味着正在打开的另一个TLB未正确注册。

修复方法是使用regtlbregtlib之类的工具或替代方案注册依赖关系TLB(在本例中为MyLibA.tlb),具体取决于您的系统。

由于问题是在无注册COM的上下文中给出的,因此您应该了解关于接口实例的编组的可能问题。通常,必须注册TLB才能使用标准编组器。否则,您必须确保在清单中正确声明封送信息,如上所述here