我正在开发一个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)。
为什么不像在Sub SetPixelBuffer(pBuffer As ICOMCvPixelBuffer)中声明的那样是.IDL?
发布于 2011-09-27 12:40:29
最后我找到了我的问题的答案。
正如我从“".NET和COM:完整的互操作性指南“”一书中了解到的,如果coclass的默认接口与coclass定义在同一个类库中,则VB6的类型库导入器将使用coclass类型替换默认接口类型的任何参数和字段。
另外,关于VB6背后的机制的有用信息可以找到这里。
Visual使用类模块名称作为默认接口的别名;也就是说,Visual编译器为您将类名映射到默认接口引用。
工作解决方案之一是提供IUnknown作为CCOMCvPixelBuffer coclass的默认接口:
[
uuid(....),
version(1.0)
]
coclass CCOMCvPixelBuffer
{
[default] interface IUnknown;
interface ICOMCvPixelBuffer;
};发布于 2011-09-25 22:06:42
据我所知,VB6不喜欢COM对象实现2+自动化接口的想法。同时,如果它实现了一个接口,那么它很可能假设这个接口是由coclass实现的,coclass声明为实现这个接口:
coclass CCOMCvBitmap {默认接口ICOMCvBitmap;
通过这种方式,VB6可能使VB6开发人员更加简单,试图用对象而不是接口来解释工作过程。
如果您对实验很感兴趣,请尝试对上面的“默认接口ICOMCvBitmap”行进行注释,看看VB6是否会将该类型显示为接口。这不应破坏互操作,因为您的ATL实现对象仍将实现IProvideClassInfo并公告已实现的接口。
https://stackoverflow.com/questions/7548390
复制相似问题