我有一个名为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')]
有人可以说出这里出了什么问题吗?
答案 0 :(得分:0)
你有一个哲学问题。当对象或函数使用回调时,正是该对象或函数定义了回调,而不是客户端(实现回调的对象或函数)。换句话说,回调合约是服务器合约的一部分。因此,在您的IDL中声明回调不仅在技术上是必要的,这是正确的。它必须是COM接口。
技术上:MIDL编译器的主要工作是生成一个类型库(.tlb),一个关于您在IDL中定义的接口的元数据包。当给定原始C ++接口时,MIDL编译器没有足够的信息来描述类型库中的该接口。当它到达该参数时,它将其视为未知的,无法解析的数据类型。