イベント処理の原則
更新 : 2007 年 11 月
すべてのイベント処理には、共通する 3 つの段階があります。次の作業を行う必要があります。
オブジェクトでのイベント インターフェイスの実装
オブジェクトへのイベントの送信元となるイベント ソースのアドバイズ
オブジェクトがイベントを受け取る必要がなくなったときのイベント ソースのアドバイズ中止
イベントの実装方法は、イベントの種類によって異なります。イベント インターフェイスは、vtable、デュアル、または DispInterface のいずれでもかまいません。インターフェイスの定義は、イベント ソースのデザイン担当者が行い、インターフェイスの実装は開発者が行います。
メモ : |
---|
技術的な点ではイベント インターフェイスをデュアルにできない理由はありませんが、デザイン上ではデュアルを使用しないほうがよい理由がいくつかあります。ただし、これはイベント ソースのデザインまたは実装の担当者が決めることです。ここではイベント シンクの観点で作業を行うため、デュアルのイベント インターフェイスを実装せざるをえない場合も考慮する必要があります。デュアル インターフェイスの詳細については、「デュアル インターフェイスと ATL」を参照してください。 |
イベント ソースのアドバイズは、次の 3 段階に分けることができます。
ソース オブジェクトに対する IConnectionPointContainer の照会。
必要なイベント インターフェイスの IID を渡す IConnectionPointContainer::FindConnectionPoint の呼び出し。正常に処理されると、コネクション ポイント オブジェクトの IConnectionPoint インターフェイスを返します。
イベント シンクの IUnknown を渡す IConnectionPoint::Advise の呼び出し。正常に処理されると、接続を表す DWORD の Cookie を返します。
イベントを受け取るときに必要なインターフェイスを正しく登録すると、ソース オブジェクトで発生したイベントに従ってオブジェクトのイベント インターフェイスのメソッドが呼び出されます。イベントの受け取りが不要になったときは、IConnectionPoint::Unadvise を通してコネクション ポイントに Cookie を送り返すことができます。これでソースとシンクとの間の接続が切断されます。
イベントを処理するとき、循環参照をしないように注意してください。