如何将简单的接口传递给COM方法?

时间:2018-03-02 06:44:56

标签: c++11 com

我有一个名为ICallbackNew的接口定义了一个头文件,以免将其命名为common.h。

interface ICallbackNew
{
virtual HRESULT MyMethod() = 0;
};

我已将头文件包含在我的COM接口方法COMMethod定义的idl文件中。

[
            object,
            uuid(1479883E-51F8-4990-AFFA-9EC1F82AC2C1),
            dual,
            helpstring("IcPIMSSyncServiceHandler Interface"),
            pointer_default(unique)
]
interface ICOMHandler : IDispatch
{
[id(1), helpstring("method COMMethod")] HRESULT COMMethod(const ICallbackNew* pCBNPtr);
};

当我尝试在VS2013中编译我的代码时,我得到如下编译 。\ handler.idl(52):错误MIDL2011:未解析的类型声明:ICallbackNew [过程'COMMethod'的参数'pCBNPtr'(接口'ICOMHandler')]

有人可以说出这里出了什么问题吗?

1 个答案:

答案 0 :(得分:0)

你有一个哲学问题。当对象或函数使用回调时,正是该对象或函数定义了回调,而不是客户端(实现回调的对象或函数)。换句话说,回调合约是服务器合约的一部分。因此,在您的IDL中声明回调不仅在技术上是必要的,这是正确的。它必须是COM接口。

技术上:MIDL编译器的主要工作是生成一个类型库(.tlb),一个关于您在IDL中定义的接口的元数据包。当给定原始C ++接口时,MIDL编译器没有足够的信息来描述类型库中的该接口。当它到达该参数时,它将其视为未知的,无法解析的数据类型。