描述:
#else /* C style interface */
typedef struct IUnknownVtbl
{
BEGIN_INTERFACE
HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
IUnknown * This,
/* [in] */ REFIID riid,
/* [iid_is][out] */ void **ppvObject);
ULONG ( STDMETHODCALLTYPE *AddRef )(
IUnknown * This);
ULONG ( STDMETHODCALLTYPE *Release )(
IUnknown * This);
END_INTERFACE
} IUnknownVtbl;
interface IUnknown
{
CONST_VTBL struct IUnknownVtbl *lpVtbl;
};
以上代码见 ATL 头文件 Unkwn.h 第 180 行
ATL 使用 C 语言方式定义了 接口 IUnknown,我有点想不通, 不知道大家注意了没有 ,定义 IUnknownVtbl 的时候使用了 IUnknown, 而 IUnknown 是在后面定义的. 这和 C 语言类型定义显然矛盾, 还有 为什么 2次定义 interface IUnknown 呢,分别出现在 unkwn.h unkwn.idl. 有没有高手能够解答?
问题得到解决后及时结帖给分。
解决方案1:
typedef interface IUnknown IUnknown;
这样定义就是提前声明一下。
和aspnetwuxueyou说的是一回事
com是定义在二进制基础上的规范,所以只要保证二进制层面上相同就可以了,用什么语言是无关紧要的
解决方案3: 1. .idl文件是接口定义文件,可以生成接口头文件,用midl编译