COM对象中的回调

时间:2017-03-24 17:33:31

标签: c++ callback com atl idl

我有一个暴露COM对象的ATL项目。我希望我的COM对象不时调用消费者指定的功能,或者通过其他方式不时通知消费者。

我尝试在CerberusNative.idl中添加一个方法,以便获取我想从COM实例端调用的void函数指针,这样消费者只需要在初始化时告诉COM对象它的回调是:

interface ICerberusSession : IDispatch {
    [id(5)] HRESULT SetCallbacks([in] void(*userExit)(int, char *), [in] void(*userAttemptingReconnection)(), [in] void(*userReconnected)());
};

但是,我的void函数指针存在一些问题:

  

严重级代码描述项目文件行抑制状态   错误MIDL2269程序在对象接口中必须返回一个   HRESULT:[(参数'userExit')]错误MIDL2131参数必须   不是函数:[Procedure'SetCallbacks'的参数'userExit'   (界面'ICerberusSession')]

在哪些方面我可以让客户端应用程序在我的COM对象中订阅回调函数?

1 个答案:

答案 0 :(得分:1)

正确的方法是使用方法定义一个单独的接口,并将该接口传递给我的setter方法:

[
    object,
    uuid(AECE8D0C-F902-4311-A374-ED3A0EBB6B49),
    dual,
    nonextensible,
    pointer_default(unique)
]
interface ICallbacks : IUnknown
{
    [id(1)] HRESULT UserExit([in] int errorCode, [in] BSTR errorMessage);
    [id(2)] HRESULT UserAttemptingReconnection();
    [id(3)] HRESULT UserReconnected();
};

[
    object,
    uuid(B98A7D3F-651A-49BE-9744-2B1D8C896E9E),
    dual,
    nonextensible,
    pointer_default(unique)
]
interface ICerberusSession : IDispatch {
    ...
    [id(5)] HRESULT SetCallbacks([in] ICallbacks* callbacks);
};