2

我在 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.dllb.dll。在这种情况下,当在多个类型库中遇到相同的接口定义时,激活上下文生成会失败。

有什么建议可以在单独的类型库中实现所需的接口和 coclass 分离吗?

4

1 回答 1

3

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

解决方法是根据您的系统,使用类似或替代regtlb工具之类的工具注册依赖项 TLB(在本例中为 MyLibA.tlb) 。regtlib

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

于 2013-03-11T16:48:38.483 回答