2017-03-24 67 views
1

我有一個公開COM對象的ATL項目。我希望我的COM對象隨時調用消費者指定的函數,或者通過其他方式不時地通知消費者。COM對象中的回調

我已經嘗試在CerberusNative.idl中添加一個方法,以便使用void函數指針,我想從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對象中的回調函數嗎?

+0

後續問題,如果有人能幫助或有興趣:HTTP ://stackoverflow.com/questions/43006702/setting-up-my-atl-com-callback-functions – Alexandru

回答

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