次の方法で共有


接続ポイント

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

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

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

実装された接続ポイントを示す図。
実装された接続ポイント

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

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

次の例では、単純な接続マップと 1 つの接続ポイントを示します。 最初の例では、接続マップとポイントを宣言します。2 番目の例では、マップとポイントを実装します。 CMyClassCCmdTarget派生クラスである必要があることに注意してください。 最初の例では、 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 マクロは、この特定の接続ポイントを実装する埋め込みクラス (XSampleConnPt (CConnectionPoint から派生) を宣言します。 CConnectionPointメンバー関数をオーバーライドしたり、独自のメンバー関数を追加したりする場合は、これら 2 つのマクロの間でそれらを宣言します。 たとえば、 CONNECTION_IID マクロは、これら 2 つのマクロの間に配置されたときに、 CConnectionPoint::GetIID メンバー関数をオーバーライドします。

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

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

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

最後に、クラスのコンストラクターで EnableConnections の呼び出しを追加します。 例えば次が挙げられます。

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

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

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