gpt4 book ai didi

c++ - 为什么在 VB6 中 COM 接口(interface)名称被 coclass 名称替换?

转载 作者:太空狗 更新时间:2023-10-29 20:46:40 24 4
gpt4 key购买 nike

我正在开发一个 C++ COM 库以在 VB6 应用程序中使用它。 .IDL 文件定义了一些接口(interface)和一个类库,其中包含一些实现这些接口(interface)的组件类:

[
local,
object,
uuid(....),
version(1.0)
]
interface ICOMCvPixelBuffer : IUnknown
{
....
};

[
local,
object,
uuid(....),
version(1.0)
]
interface ICOMCvBitmap : IUnknown
{
....
HRESULT GetPixelBuffer([retval][out] ICOMCvPixelBuffer** pBuffer);
HRESULT SetPixelBuffer([in] ICOMCvPixelBuffer* pBuffer);
....
};

[
uuid(....),
version(1.0)
]
library COMCvLibrary
{
importlib("stdole32.tlb");
interface ICOMCvBitmap;
interface ICOMCvPixelBuffer;

[
uuid(....),
version(1.0)
]
coclass CCOMCvPixelBuffer
{
[default] interface ICOMCvPixelBuffer;
};

[
uuid(....),
version(1.0)
]
coclass CCOMCvBitmap
{
[default] interface ICOMCvBitmap;
};
};

VB6 中的对象浏览器将 CCOMCvBitmap 类的 SetPixelBuffer 方法定义为 Sub SetPixelBuffer(pBuffer As CCOMCvPixelBuffer)

为什么它不是在 .IDL 中声明的 Sub SetPixelBuffer(pBuffer As ICOMCvPixelBuffer)

最佳答案

我终于找到了问题的答案。

正如我从书中了解到的".NET and COM: The Complete Interoperability Guide" , 如果 coclass 的默认接口(interface)定义在与 coclass 相同的类库中,则 VB6 的类型库导入器将默认接口(interface)类型的所有参数和字段替换为 coclass 类型。

此外,可以找到有关支持 VB6 的机制的有用信息 here :

Visual Basic uses the class module name as an alias for the default interface; that is, the Visual Basic compiler maps the class name to the default interface reference silently for you.

其中一个可行的解决方案是提供 IUnknown 作为 CCOMCvPixelBuffer coclass 的默认接口(interface):

[
uuid(....),
version(1.0)
]
coclass CCOMCvPixelBuffer
{
[default] interface IUnknown;
interface ICOMCvPixelBuffer;
};

关于c++ - 为什么在 VB6 中 COM 接口(interface)名称被 coclass 名称替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7548390/

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