c – 为什么在VB6中用coclass名称替换COM接口名称?

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

[
    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的默认接口在与coclass相同的类库中定义,则VB6的类型库导入器将使用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的默认接口提供:

[
    uuid(....),
    version(1.0)
]
coclass CCOMCvPixelBuffer
{
    [default] interface IUnknown;
    interface ICOMCvPixelBuffer;
};
上一篇:photoshop利用取样器工具为偏色人物图片精确修复


下一篇:Python编程-注释