IDispEventImpl のサポート
テンプレート クラス IDispEventImpl を使用すると、ATL クラスでコネクション ポイント シンクをサポートできます。 コネクション ポイント シンクを使用すると、外部の COM オブジェクトによって発生したイベントを自分のクラスで処理できます。 コネクション ポイント シンクは、クラスが提供するイベント シンク マップに割り当てられます。
クラスのコネクション ポイント シンクを正しく実装するには、次の手順を実行する必要があります。
各外部オブジェクトのタイプ ライブラリをインポートします。
IDispEventImpl インターフェイスを宣言します。
イベント シンク マップを宣言します。
コネクション ポイントのアドバイズとアドバイズ中止を行います。
コネクション ポイント シンクの実装に関する手順は、自分のクラスのヘッダー ファイル (.h) を変更するだけですべて実行されます。
タイプ ライブラリのインポート
イベントを処理する外部オブジェクトごとに、タイプ ライブラリをインポートする必要があります。 この手順では、処理できるイベントを定義し、イベント シンク マップの宣言に使用する情報を提供します。 この処理には #import ディレクティブを使用します。 サポートするディスパッチ インターフェイスごとに、必要な #import ディレクティブの行をクラスのヘッダー ファイル (.h) に追加します。
外部 COM サーバー (MSCAL.Calendar.7) のタイプ ライブラリをインポートする例を次に示します。
#import "PROGID:MSCAL.Calendar.7" no_namespace, raw_interfaces_only
注意
サポートする外部タイプ ライブラリごとに #import ステートメントが必要です。
IDispEventImpl インターフェイスの宣言
各ディスパッチ インターフェイスのタイプ ライブラリをインポートした後で、外部ディスパッチ インターフェイスごとに IDispEventImpl インターフェイスを宣言する必要があります。 外部オブジェクトごとに IDispEventImpl インターフェイス宣言を追加して、クラスの宣言を変更します。 パラメーターの詳細については、IDispEventImpl の説明を参照してください。
次のコードでは、CMyCompositCtrl2 クラスで実装された COM オブジェクトのコネクション ポイント シンクを、DCalendarEvents インターフェイス用に 2 つ宣言します。
public IDispEventImpl<IDC_CALENDAR1, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>,
public IDispEventImpl<IDC_CALENDAR2, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>
イベント シンク マップの宣言
イベント通知を正しい関数で処理できるように、クラスで各イベントを正しいハンドラーに送る必要があります。 この処理を行うために、イベント シンク マップを宣言します。
ATL には、このマップを簡単に実行できるように、BEGIN_SINK_MAP、END_SINK_MAP、および SINK_ENTRY_EX の各マクロが用意されています。 標準的な形式は次のとおりです。
BEGIN_SINK_MAP(comClass)
SINK_ENTRY_EX(id, iid, dispid, func)
. . . //additional external event entries
END_SINK_MAP()
2 つのイベント ハンドラーを持つイベント シンク マップを宣言する例を次に示します。
BEGIN_SINK_MAP(CMyCompositCtrl2)
//Make sure the Event Handlers have __stdcall calling convention
SINK_ENTRY_EX(IDC_CALENDAR1, __uuidof(DCalendarEvents), DISPID_CLICK,
&CMyCompositCtrl2::ClickCalendar1)
SINK_ENTRY_EX(IDC_CALENDAR2, __uuidof(DCalendarEvents), DISPID_CLICK,
&CMyCompositCtrl2::ClickCalendar2)
END_SINK_MAP()
これで実装はほぼ完了です。 最後に、外部インターフェイスのアドバイズとアドバイズ中止を行います。
IDispEventImpl インターフェイスのアドバイズとアドバイズ中止
最後に、適切なタイミングですべてのコネクション ポイントのアドバイズまたはアドバイズ中止を行うメソッドを実装します。 外部クライアントとオブジェクトとの通信が行われる前に、このアドバイズを行う必要があります。 オブジェクトが表示される前に、オブジェクトでサポートされている各外部ディスパッチ インターフェイスに対して、アウトゴーイング インターフェイスに関する照会が行われます。 接続が確立されると、オブジェクトからのイベントを処理するために、アウトゴーイング インターフェイスへの参照が使用されます。 このプロシージャを "アドバイズ" と呼びます。
クラスで外部インターフェイスが不要になったら、その旨をアウトゴーイング インターフェイスに通知する必要があります。 このプロシージャを "アドバイズ中止" と呼びます。
COM オブジェクト固有の性質のため、このプロシージャの詳細と実行方法は実装ごとに異なります。 詳細はこのトピックの対象外であり、ここでは説明しません。