2017-03-24 9 views
1

私はCOMオブジェクトを公開するATLプロジェクトを持っています。 COMオブジェクトは、時々、消費者によって指定された関数を呼び出すことができますか、または時々消費者に通知する他の手段を介して呼び出すことができます。COMオブジェクト内のコールバック

私はCerberusNative.idlにメソッドを追加しようとしましたが、コールバックが何であるかをコンシューマがCOMオブジェクトに通知する必要があるように、COMインスタンス側から呼び出すvoidポインタを使用します。 :再しなければならないオブジェクトのインタフェースで

重大度コード説明プロジェクトファイルの行抑制状態 エラーMIDL2269手順:

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

しかし、私の空関数ポインタといくつかの問題があります HRESULT回す:[(パラメータ 'ユーザー出口を')]エラーMIDL2131パラメータは 機能であってはならない:[プロシージャ 'SetCallbacks' (インターフェース 'ICerberusSession')のパラメータ 'ユーザー出口']

どのような方法でCOMオブジェクト内のコールバック関数を購読するクライアントアプリケーションを取得できますか?

+0

フォローアップの質問を誰が助けるか、興味を持っていることができるかどうます。http ://stackoverflow.com/questions/43006702/setting-up-my-atl-com-callback-functions – Alexandru

答えて

1

それを行うための正しい方法は、その上にメソッドを持つ別のインタフェースを定義するために、そして私のセッターメソッドにそのインターフェイスを渡すことです:

[ 
    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); 
}; 
関連する問題