gpt4 book ai didi

COM coclass 实现来自另一个类型库的接口(interface)

转载 作者:行者123 更新时间:2023-12-04 05:07:27 27 4
gpt4 key购买 nike

我在 COM 中相对较新,所以如果这是一个愚蠢的问题,我很抱歉。我将一堆 COM 接口(interface)编译到类型库 A 中。这个类型库是我的解决方案中的一个 DLL (a.dll) 中的资源。在进入单独 DLL (b.dll) 的单独类型库 (B) 中,我想定义一个实现类型库 A 接口(interface)的 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 实现的所有接口(interface)以及 coclass 定义本身。这是真的?

如果我删除 importlib("MyLibA.tlb);声明,我可以在oleview中查看编译的tlb文件没有错误,但是MyLibB.tlb还包含 IMyInterface的定义接口(interface),即接口(interface)在两个类型库中定义了两次。我不希望这样,因为在我的应用程序中,我使用免注册 COM 加载了 a.dll 和 b.dll。在这种情况下,当在多个类型库中遇到相同的接口(interface)定义时,激活上下文生成会失败。

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

最佳答案

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

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

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

关于COM coclass 实现来自另一个类型库的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15342012/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com