次の方法で共有


IDispEventImpl のサポート

テンプレート クラス IDispEventImpl が ATL クラスのコネクション ポイント シンクをサポートするために使用できます。外部 COM オブジェクトから発生した接続ポイント シンクは、クラスのイベントを処理できます。これらのコネクション ポイント シンクはイベント シンク マップと、クラスにマップされます。

正しくクラスのコネクション ポイント シンクを実行するには、以下の手順を実行する必要があります:

  • 各外部オブジェクトのタイプ ライブラリをインポート

  • IDispEventImpl のインターフェイスを宣言します。

  • イベント シンク マップを宣言します。

  • unadvise コネクション ポイントするとアドバイス

コネクション ポイント シンクすべて実行に関連する手順は、クラスのヘッダー ファイルだけです (.h) 変更します。

タイプ ライブラリのインポート

、処理するイベント タイプ ライブラリをインポートする必要のある各外部オブジェクトに対して。この手順では、処理できる定義し、使用する情報を提供するイベントをイベント シンク マップを宣言するとき。#import ディレクティブが、を使用できます。では、クラスのヘッダー ファイルにサポートする各ディスパッチ インターフェイスの #import の必要なディレクティブの行を追加します (.h)。

次の例は、外部 COM サーバー (MSCAL.Calendar.7) のタイプ ライブラリをインポート:

#import "PROGID:MSCAL.Calendar.7" no_namespace, raw_interfaces_only

[!メモ]

でサポートする各外部タイプ ライブラリの #import にステートメントが必要です。

IDispEventImpl インターフェイスの宣言

各ディスパッチ インターフェイスのタイプ ライブラリをインポートするため、各外部ディスパッチ インターフェイスの IDispEventImpl の別のインターフェイスを宣言する必要があります。各外部オブジェクトの IDispEventImpl のインターフェイス宣言を追加することで、クラスの宣言を変更します。パラメーターの詳細については、IDispEventImplを参照してください。

次のコードでは、2 とおりのコネクション ポイント シンク、DCalendarEvents インターフェイスに CMyCompositCtrl2、クラスで実装される COM オブジェクトを宣言します:

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_MAPEND_SINK_MAPSINK_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()

実装はほぼ完了です。最後に、外部インターフェイスの表示と unadvising の問題です。

アドバイズと Unadvising IDispEventImpl のインターフェイス

最後の手順は、必要なときに (または) unadvise すべてのコネクション ポイントに指示するメソッドを実装することです。アドバイズするこれは、外部クライアントすると、オブジェクト間の通信の前にされていない場合に発生します。、オブジェクトが表示されるようになる前に、オブジェクトによってサポートされる各外部ディスパッチ インターフェイスは、アウトゴーイング インターフェイスに問い合わせます。接続が確立され、オブジェクトからのイベントを処理するためにアウトゴーイング インターフェイスへの参照が使用されます。この手順は、「」と表示されます。

、オブジェクトが外部インターフェイスと終了すると、アウトゴーイング インターフェイスは、クラスによっても使用されていないことを把握する必要があります。このプロセスは「」と呼ばれ unadvising。

COM オブジェクトの一意な性質については、この手順では、実装の間で、詳細実行、異なるため。これらの詳細は、このトピックの範囲を超えるあり、アドレス。

参照

関連項目

ATL COM オブジェクトの基本事項