我正在开发一个 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 中的对象浏览器SetPixelBuffer将CCOMCvBitmap类的方法定义显示为Sub SetPixelBuffer(pBuffer As CCOMCvPixelBuffer).
为什么它不像Sub SetPixelBuffer(pBuffer As ICOMCvPixelBuffer).IDL 中声明的那样?
据我所知,VB6 不喜欢 COM 对象实现 2 个以上自动化接口的想法。除此之外,如果它实现了一个,那么很可能该接口是由声明为实现此接口的 coclass 实现的:
coclass CCOMCvBitmap { [默认] 接口 ICOMCvBitmap;
这样,VB6 可能会让 VB6 开发人员更容易理解,尝试使用对象而不是接口来解释工作原理。
如果您对实验感兴趣,请尝试注释“[default] interface ICOMCvBitmap;”行 上面看看 VB6 是否会将类型显示为接口。这不应破坏互操作,因为您的 ATL 实现对象仍将实现 IProvideClassInfo 并通告实现的接口。