コネクション ポイント
この技術情報では、 MFC クラス CCmdTarget と CConnectionPointを使用してコネクション ポイントを (以前の OLE コネクション ポイントと呼ばれる)を実装する方法について説明します。
これまで、コンポーネント オブジェクト モデル (COM) は、オブジェクトがインターフェイスの機能を実行し、公開するようにした汎用機能IUnknown::QueryInterface()を定義しています。ただし、特定のインターフェイスをダイヤルするオブジェクトが機能を公開するようにする同等の機能は定義されていません。つまり、オブジェクト (このオブジェクトのインターフェイスへのポインター)へのポインターが入力の処理方法定義された COM、アウトゴーイング インターフェイスの明示的なモデルがないこと (ポインターは、ほかのオブジェクトにインターフェイス オブジェクトを保留)。COM に、コネクション ポイントと呼ばれるこの機能をサポートするモデルがあります。
接続にの 2 つがあります: ソースおよびシンクと呼ばれるインターフェイスを実装するオブジェクトと呼ばれるインターフェイスを呼び出すオブジェクト。コネクション ポイントはソースによって公開されるインターフェイスです。コネクション ポイントを公開することで、ソースはシンクがそれ自体への接続を確立します (ソース)。コネクション ポイントの機能 ( IConnectionPoint インターフェイス)を使用して、シンク インターフェイスへのポインターは、ソース オブジェクトに渡されます。このポインターはシンクのセットのメンバー関数の実装へのアクセスをソースに示します。たとえば、シンクによって実装されたイベントを発生させるソースはシンクの実装の適切なメソッドをダイヤルできます。次の図に示す、コネクション ポイントを示します。
コネクション ポイントの実装
MFC は CConnectionPoint と CCmdTarget のクラスでこのモデルを実装します。CConnectionPoint から派生したクラスは、他のオブジェクトにコネクション ポイントを公開するために使用される IConnectionPoint インターフェイスを実装します。CCmdTarget から派生したクラスは、オブジェクトを使用してコネクション ポイントをすべて列挙したり、特定のコネクション ポイントを取得 IConnectionPointContainer インターフェイスを実装します。
クラスで実装される各コネクション ポイントのコネクション ポイントを実装する接続のパーツを宣言します。一つ以上のコネクション ポイントを実装する場合、クラスに単一のコネクション マップを宣言します。コネクション マップは、 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()
END_CONNECTION_PART の BEGIN_CONNECTION_PART とマクロはこの特定のコネクション ポイントを実装する埋め込みクラス、 XSampleConnPt を CConnectionPoint(から派生)宣言します。CConnectionPoint のメンバー関数をオーバーライドするか、独自のメンバー関数を追加する場合は、この二つのマクロの間で宣言します。たとえば、 CONNECTION_IID のマクロは、これら二つのマクロの間にある場合 CConnectionPoint::GetIID のメンバー関数をオーバーライドします。
2 番目の例では、コードはコントロールの実装ファイル (.cpp ファイル)に挿入されます。このコードは、コネクション ポイントを含むコネクション マップ、 SampleConnPt実行します:
BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()
クラスが複数のコネクション ポイントがある場合は、 END_CONNECTION_MAP の BEGIN_CONNECTION_MAP とマクロとの CONNECTION_PART 追加のマクロを挿入します。
最後に、クラス コンストラクターの EnableConnections に呼び出しを追加します。次に例を示します。
CMyClass::CMyClass()
{
EnableConnections();
}
このコードが挿入された場合、 CCmdTarget派生クラスは ISampleSink インターフェイス用のコネクション ポイントを公開します。次の図は、この例について説明します。
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();
}
}
この例は、呼び出しで CConnectionPoint::GetConnectionsへの SampleConnPt のコネクション ポイントの接続の現在の設定を取得します。これは、接続を通じて、繰り返し、どのアクティブな接続の ISampleSink::SinkFunc をダイヤルします。