イベント処理の原則
すべてのイベント処理に共通する手順が 3 つあります。 次のことを行う必要があります。
オブジェクトにイベントインターフェイスを実装する。
オブジェクトがイベントを受け取る必要があることをイベント ソースに通知する。
オブジェクトがイベントを受け取る必要がなくなったときに、イベント ソースの通知を解除する。
イベント インターフェイスを実装する方法は、その型によって異なります。 イベント インターフェイスは、vtable、デュアル、またはディスパッチ インターフェイスにすることができます。 インターフェイスを定義するのは、イベント ソースのデザイナーの責任であり、そのインターフェイスを実装するのはユーザーの責任です。
Note
イベント インターフェイスをデュアルにすることはできないという技術的な理由はありませんが、デュアルの使用を避けるために十分な設計上の理由がいくつかあります。 ただし、これはイベント "ソース" のデザイナーまたは実装者により決断されることです。 ユーザーは、イベント sink
の観点から作業しているため、デュアル イベント インターフェイスを実装する以外に選択肢がないという可能性を考慮する必要があります。 デュアル インターフェイスの詳細については、「デュアル インターフェイスと ATL」をご覧ください。
イベント ソースの通知は、次の 3 つの手順に分けることができます。
IConnectionPointContainer にソース オブジェクトのクエリを実行する。
IConnectionPointContainer::FindConnectionPoint を呼び出して関心があるイベント インターフェイスの IID を渡す。 成功すると、コネクション ポイント オブジェクトの IConnectionPoint インターフェイスが返される。
IConnectionPoint::Advise を呼び出して、イベント シンクの
IUnknown
を渡す。 成功すると、接続を表すDWORD
Cookie が返される。
イベントの受信に対する関心が正常に登録されると、オブジェクトのイベント インターフェイスのメソッドが、ソース オブジェクトによって発生したイベントに従って呼び出されます。 イベントを受け取る必要がなくなった場合は、IConnectionPoint::Unadvise を経由して Cookie をコネクション ポイントに返すことができます。 これにより、ソースとシンク間の接続が切断されます。
イベントを処理するときは、参照サイクルを避けるようにご注意ください。