CConnectionPoint クラス
更新 : 2007 年 11 月
他の OLE オブジェクトと通信するために使われる "コネクション ポイント" と呼ばれる特別な型のインターフェイスを定義します。
class CConnectionPoint : public CCmdTarget
解説
OLE コントロールの機能を実装し、公開するために使われる通常の OLE インターフェイスとは異なり、コネクション ポイント、イベントや変更通知の起動など、ほかのオブジェクトに対するアクションを実行できるアウトゴーイング インターフェイスを実装します。
接続は、"ソース" と呼ばれるインターフェイスを呼び出すオブジェクトと、"シンク" と呼ばれるインターフェイスを実装するオブジェクトの、2 つの部分から構成されます。コネクション ポイントを公開すると、ソースとシンクの接続が確立できます。コネクション ポイント機構を使って、ソース オブジェクトはシンクの一連のメンバ関数へのポインタを取得します。たとえば、シンクが実装しているイベントを発生させるには、ソースはシンク実装の適切なメソッドを呼び出します。
既定では、COleControl の派生クラスは 2 つのコネクション ポイントを実装します。1 つはイベント用で、もう 1 つはプロパティ変更通知用です。一方の接続でイベントを発生させ、もう一方の接続でプロパティの値の変更をシンク (コントロールのコンテナなど) に通知します。また、OLE コントロール用にさらにコネクション ポイントを用意することもできます。コントロール クラスに実装する追加コネクション ポイントごとに、"接続部" を宣言する必要があります。接続部がコネクション ポイントを実装します。1 つ以上のコネクション ポイントを実装するときは、コントロール クラスごとに 1 つの "接続マップ" も宣言する必要があります。
次の例は、OLE コントロール Sample 用の単純な接続マップと 1 つのコネクション ポイントを示しています。プログラムの前半では、接続マップとコネクション ポイントを宣言しています。後半は宣言した接続マップとコネクション ポイントを実装しています。プログラムの前半はコントロール クラスの宣言中の 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 つのマクロの間に宣言を挿入します。たとえば、この 2 つのマクロ間に CONNECTION_IID を挿入すると、CConnectionPoint::GetIID メンバ関数がオーバーライドされます。
プログラムの後半はコントロール クラスの実装ファイル (.CPP) に挿入されます。後半部分は接続マップを実装しています。この部分では、追加するコネクション ポイント SampleConnPt を組み込みます。
BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()
この 2 つのプログラムを挿入すると、Sample OLE コントロールは ISampleSink インターフェイス用のコネクション ポイントを公開します。
通常、コネクション ポイントは "マルチキャスティング" をサポートします。マルチキャスティングは、同じインターフェイスに接続された複数のシンクにブロードキャストする機能です。次の例では、1 つのコネクション ポイントで各シンクに繰り返しアクセスすることで、マルチキャスティングを実現しています。
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 を呼び出します。
CConnectionPoint の使い方の詳細については、「コネクション ポイント」を参照してください。
必要条件
ヘッダー : afxdisp.h