在COM对象回调(Callbacks in COM objects)

2019-09-28 15:47发布

我有一个公开COM对象的ATL项目。 我想我的COM对象调用由消费者不时指定的功能时,或通过从时间通知消费者时间的一些其他手段。

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

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

然而,也有一些问题,我的空函数指针:

严重性代码描述项目文件行抑制状态错误MIDL2269程序中的对象接口必须返回一个HRESULT:[(参数“USEREXIT”)]错误MIDL2131参数不能为一个函数:[步骤“SetCallbacks”的参数“USEREXIT”(接口“ ICerberusSession”)]

有什么办法,我可以得到一个客户端应用程序订阅回调函数在我的COM对象?

Answer 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);
};


文章来源: Callbacks in COM objects