IDispEventImpl のサポート
テンプレート クラス IDispEventImpl を使用して、ATL クラスの接続ポイント シンクをサポートできます。 接続ポイント シンクを使用すると、外部 COM オブジェクトから発生したイベントをクラスで処理できます。 これらの接続ポイント シンクは、クラスによって提供されるイベント シンク マップにマップされます。
クラスの接続ポイント シンクを適切に実装するには、次の手順を完了する必要があります。
各外部オブジェクトのタイプ ライブラリをインポートする。
IDispEventImpl
インターフェイスを宣言する。イベント シンク マップを宣言する。
接続ポイントのアドバイスとアドバイス解除を行う。
接続ポイント シンクの実装に必要な手順は、クラスのヘッダー ファイル (.h) のみを変更することで実現されます。
タイプ ライブラリのインポート
イベントを処理する外部オブジェクトごとに、タイプ ライブラリをインポートする必要があります。 この手順では、処理できるイベントを定義し、イベント シンク マップを宣言するときに使用される情報を提供します。 これを実行するには #import ディレクティブを使用できます。 サポートする各ディスパッチ インターフェイスに必要な #import
ディレクティブ行を、クラスのヘッダー ファイル (.h) に追加します。
次の例では、外部 COM サーバーのタイプ ライブラリをインポートします (MSCAL.Calendar.7
)。
#import "PROGID:MSCAL.Calendar.7" no_namespace, raw_interfaces_only
Note
サポートする外部タイプ ライブラリごとに個別の #import
ステートメントが必要です。
IDispEventImpl インターフェイスの宣言
各ディスパッチ インターフェイスのタイプ ライブラリをインポートしたので、外部ディスパッチ インターフェイスごとに個別の IDispEventImpl
インターフェイスを宣言する必要があります。 各外部オブジェクトの IDispEventImpl
インターフェイス宣言を追加して、クラスの宣言を変更します。 これらのパラメーターの詳細については、「IDispEventImpl」を参照してください。
次のコードでは、DCalendarEvents
インターフェイスおよび、クラス CMyCompositCtrl2
によって実装される COM オブジェクトに、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 オブジェクトの固有の性質のため、この手順の詳細と実行は実装によって異なります。 これらの詳細は、このトピックでは扱いません。