COM 对象中的回调
Callbacks in COM objects
我有一个公开 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)());
};
但是,我的 void 函数指针有一些问题:
Severity Code Description Project File Line Suppression State
Error MIDL2269 procedures in an object interface must return an
HRESULT : [( Parameter 'userExit' ) ] Error MIDL2131 parameter must
not be a function : [ Parameter 'userExit' of Procedure 'SetCallbacks'
( Interface 'ICerberusSession' ) ]
我可以通过哪些方式让客户端应用程序订阅我的 COM 对象中的回调函数?
正确的做法是定义一个带有方法的单独接口,然后将该接口传递到我的 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);
};
我有一个公开 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)());
};
但是,我的 void 函数指针有一些问题:
Severity Code Description Project File Line Suppression State Error MIDL2269 procedures in an object interface must return an HRESULT : [( Parameter 'userExit' ) ] Error MIDL2131 parameter must not be a function : [ Parameter 'userExit' of Procedure 'SetCallbacks' ( Interface 'ICerberusSession' ) ]
我可以通过哪些方式让客户端应用程序订阅我的 COM 对象中的回调函数?
正确的做法是定义一个带有方法的单独接口,然后将该接口传递到我的 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);
};