我正在开发一个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;
};