首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COM coclass实现来自另一种类型库的接口

COM coclass实现来自另一种类型库的接口
EN

Stack Overflow用户
提问于 2013-03-11 15:08:33
回答 1查看 1.4K关注 0票数 2

我在COM上还比较新,所以如果这是个愚蠢的问题的话,那就来看看吧。我正在将一堆COM接口编译成一个类型库A。这个类型库是我的解决方案中的DLL (a.dll)中的一个资源。在进入一个单独的DLL (b.dll)的独立类型库(B)中,我想定义一个实现类型库A接口的coclass。请参阅下面的IDL代码,作为我所想到的一个简化示例:

代码语言:javascript
复制
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.dll和b.dll。在此场景中,激活上下文生成在多个类型库中遇到相同的接口定义时会失败。

有什么建议吗?如何在不同类型的库中实现所需的接口和同级分离?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-11 16:48:38

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

解决方法是根据系统的不同,将依赖项TLB (在本例中为MyLibA.tlb)注册到regtlbregtlib或alternative之类的工具中。

由于这个问题是在无注册COM的上下文中提出的,因此您应该注意到与接口实例的封送处理有关的可能问题。通常,必须注册TLB才能使用标准封送器。否则,您必须确保在清单中正确声明封送处理信息,如前面提到的这里

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15342012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档