首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在VB6中COM接口名被coclass名称所取代?

为什么在VB6中COM接口名被coclass名称所取代?
EN

Stack Overflow用户
提问于 2011-09-25 20:31:22
回答 2查看 826关注 0票数 5

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

代码语言:javascript
复制
[
    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)

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

EN

回答 2

Stack Overflow用户

发布于 2011-09-27 12:40:29

最后我找到了我的问题的答案。

正如我从“".NET和COM:完整的互操作性指南“”一书中了解到的,如果coclass的默认接口与coclass定义在同一个类库中,则VB6的类型库导入器将使用coclass类型替换默认接口类型的任何参数和字段。

另外,关于VB6背后的机制的有用信息可以找到这里

Visual使用类模块名称作为默认接口的别名;也就是说,Visual编译器为您将类名映射到默认接口引用。

工作解决方案之一是提供IUnknown作为CCOMCvPixelBuffer coclass的默认接口:

代码语言:javascript
复制
[
    uuid(....),
    version(1.0)
]
coclass CCOMCvPixelBuffer
{
    [default] interface IUnknown;
    interface ICOMCvPixelBuffer;
};
票数 4
EN

Stack Overflow用户

发布于 2011-09-25 22:06:42

据我所知,VB6不喜欢COM对象实现2+自动化接口的想法。同时,如果它实现了一个接口,那么它很可能假设这个接口是由coclass实现的,coclass声明为实现这个接口:

coclass CCOMCvBitmap {默认接口ICOMCvBitmap;

通过这种方式,VB6可能使VB6开发人员更加简单,试图用对象而不是接口来解释工作过程。

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

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

https://stackoverflow.com/questions/7548390

复制
相关文章

相似问题

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