为什么在 VB6 中 COM 接口名称被 coclass 名称替换?

ezp*_*sso 5 c++ vb6 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;
    };
};
Run Code Online (Sandbox Code Playgroud)

VB6 中的对象浏览器SetPixelBufferCCOMCvBitmap类的方法定义显示为Sub SetPixelBuffer(pBuffer As CCOMCvPixelBuffer).

为什么它不像Sub SetPixelBuffer(pBuffer As ICOMCvPixelBuffer).IDL 中声明的那样?

Rom*_* R. 2

据我所知,VB6 不喜欢 COM 对象实现 2 个以上自动化接口的想法。除此之外,如果它实现了一个,那么很可能该接口是由声明为实现此接口的 coclass 实现的:

coclass CCOMCvBitmap { [默认] 接口 ICOMCvBitmap;

这样,VB6 可能会让 VB6 开发人员更容易理解,尝试使用对象而不是接口来解释工作原理。

如果您对实验感兴趣,请尝试注释“[default] interface ICOMCvBitmap;”行 上面看看 VB6 是否会将类型显示为接口。这不应破坏互操作,因为您的 ATL 实现对象仍将实现 IProvideClassInfo 并通告实现的接口。