【问题标题】:COM coclass implementing interface from another type libraryCOM coclass 实现来自另一个类型库的接口
【发布时间】:2013-02-26 19:57:49
【问题描述】:

我在 COM 方面相对较新,所以如果这是一个愚蠢的问题,请原谅。我将一堆 COM 接口编译到类型库 A 中。此类型库是我的解决方案中的一个 DLL (a.dll) 中的资源。在进入单独 DLL (b.dll) 的单独类型库 (B) 中,我想定义一个实现类型库 接口的 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 分离?

【问题讨论】:

  • 谢谢,成功了,我现在可以在 OLEView 中查看 MyLibB.tlb 的 tlb。我没有注册 MyLibA.tlb 的原因是因为我使用的是免注册 COM。
  • 我已删除评论并将其添加为答案,以防其他人发现它有用。

标签: com idl midl coclass


【解决方案1】:

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

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

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

【讨论】:

  • 是的,我认为 tlb 以某种方式损坏,因为 OLEView 不会打开它,但那是因为 MyLibA.tlb 未注册。我确认在我的免注册 COM 场景中我可以使用我的 coclass 而无需注册任何 tlb,我只需要注册 OLEView。
  • 我在答案中添加了一条注释,因为由于 tlb 未注册,您可能会遇到编组问题。
猜你喜欢
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 2016-04-28
相关资源
最近更新 更多