コネクション ポイント

この記事では、MFC クラスと を使用して接続ポイント (旧称 OLE 接続ポイント) を実装する方法について説明 CCmdTarget します CConnectionPoint

前に、コンポーネント オブジェクト モデル (COM) では、オブジェクトがインターフェイスに機能を実装して公開できる一般的なメカニズム ( IUnknown::QueryInterface *) を定義しました。 ただし、オブジェクトが特定のインターフェイスを呼び出す機能を公開できる対応するメカニズムは定義されていませんでした。 つまり、COM は、オブジェクトへの受信ポインター (そのオブジェクトのインターフェイスへのポインター) の処理方法を定義しましたが、送信インターフェイスの明示的なモデルを持ってはいけなかった (オブジェクトが他のオブジェクトのインターフェイスを保持するポインター)。 COM には、この機能をサポートするコネクション ポイントと呼ばれるモデルが追加されました。

接続には、ソースと呼ばれるインターフェイスを呼び出すオブジェクトと、シンクと呼ばれるインターフェイスを実装するオブジェクトの 2 つの部分があります。 接続ポイントは、ソースによって公開されるインターフェイスです。 ソースは、接続ポイントを公開することで、シンクが自身 (ソース) への接続を確立できます。 接続ポイント メカニズム (インターフェイス) を介して、シンク インターフェイスへの IConnectionPoint ポインターがソース オブジェクトに渡されます。 このポインターは、一連のメンバー関数のシンクの実装へのアクセス権をソースに提供します。 たとえば、シンクによって実装されたイベントを発生するために、ソースはシンクの実装の適切なメソッドを呼び出します。 次の図は、説明した接続ポイントを示しています。

Diagram showing an implemented connection point.
コネクション ポイントの実装

MFC は 、CConnectionPoint クラスと CCmdTarget クラスにこのモデルを実装 します。 から派生したクラスは CConnectionPoint 、 インターフェイスを IConnectionPoint 実装します。このインターフェイスは、接続ポイントを他のオブジェクトに公開するために使用されます。 から派生したクラスは、 インターフェイスを実装します。このインターフェイスでは、オブジェクトの使用可能なすべての接続ポイントを列挙したり、 CCmdTargetIConnectionPointContainer 特定の接続ポイントを検索したりできます。

クラスに実装された接続ポイントごとに、接続ポイントを実装する接続部分を宣言する必要があります。 1 つ以上の接続ポイントを実装する場合は、クラスで 1 つの接続マップも宣言する必要があります。 接続マップは、 コントロールでサポートされる接続ポイントのActiveXです。

次の例では、単純な接続マップと 1 つの接続ポイントを示します。 最初の例では、接続マップとポイントを宣言します。2 番目の例では、マップとポイントを実装します。 は派生 CMyClass クラス CCmdTarget である必要があります。 最初の例では、 セクションの下のクラス宣言にコードが挿入 protected されます。

class CMyClass : public CCmdTarget
{
protected:
   // Connection point for ISample interface
   BEGIN_CONNECTION_PART(CMyClass, SampleConnPt)
      CONNECTION_IID(IID_ISampleSink)
   END_CONNECTION_PART(SampleConnPt)

   DECLARE_CONNECTION_MAP()

このBEGIN_CONNECTION_PARTマクロEND_CONNECTION_PART、この特定の接続ポイントを実装する埋め込みクラス (から派生) を宣言します。 メンバー関数をオーバーライドする場合、または独自のメンバー関数を追加する場合は、これら 2 つのマクロの間 CConnectionPoint でそれらを宣言します。 たとえば、 マクロは CONNECTION_IID 、これら 2 つのマクロ CConnectionPoint::GetIID の間に配置された場合、メンバー関数をオーバーライドします。

2 番目の例では、コードがコントロールの実装ファイル (.cpp ファイル) に挿入されます。 このコードは、接続ポイント を含む接続マップを実装します SampleConnPt

BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
    CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()

クラスに複数の接続ポイントがある場合は、CONNECTION_PARTマクロとマクロの間にBEGIN_CONNECTION_MAPマクロEND_CONNECTION_MAPします。

最後に、 クラスのコンストラクターに EnableConnections の呼び出しを追加します。 例:

CMyClass::CMyClass()
{
   EnableConnections();
}

このコードが挿入されると、派生クラスは インターフェイス CCmdTarget の接続ポイントを公開 ISampleSink します。 この例を次の図に示します。

Diagram showing a Connection point implemented by using MFC.
MFC で実装された接続ポイント

通常、接続ポイントは、同じインターフェイスに接続されている複数のシンクにブロードキャストする "マルチキャスト" — 機能をサポートします。 次のフラグメント例は、接続ポイント上の各シンクを反復処理してマルチキャストする方法を示しています。

void CMyClass::CallSinkFunc()
{
   POSITION pos = m_xSampleConnPt.GetStartPosition();
   ISampleSink* pSampleSink;
   while (pos != NULL)
   {
      pSampleSink = (ISampleSink*)(m_xSampleConnPt.GetNextConnection(pos));
      if (pSampleSink != NULL)
         pSampleSink->SinkFunc();
   }
}

この例では、 を呼び出して、接続ポイント上の現在の SampleConnPt 接続セットを取得します CConnectionPoint::GetConnections 。 その後、接続を反復処理し、アクティブな接続 ISampleSink::SinkFunc ごとに を呼び出します。

関連項目

MFC COM