COM 对象中的回调

问题描述 投票:0回答:2

我有一个公开 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 参数必须 不是函数:[过程“SetCallbacks”的参数“userExit” (接口“ICerberusSession”)]

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

c++ callback com atl idl
2个回答
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);
};

0
投票

COM 有一个称为连接点的概念

© www.soinside.com 2019 - 2024. All rights reserved.