CConnectionPoint クラス
他の OLE オブジェクトと通信するために使われる "コネクション ポイント" と呼ばれる特別な型のインターフェイスを定義します。
class CConnectionPoint : public CCmdTarget
解説
OLE コントロールの機能を実装し、公開するために使われる通常の OLE インターフェイスとは異なり、コネクション ポイント、イベントや変更通知の起動など、ほかのオブジェクトに対するアクションを実行できるアウトゴーイング インターフェイスを実装します。
接続では、2 つの部分で構成されます。「ソース」と、インターフェイスを実装するオブジェクトと呼ばれるインターフェイスを呼び出すオブジェクトは、「シンク」と呼ばれるコネクション ポイントを公開すると、ソースとシンクの接続が確立できます。 コネクション ポイント機構を使って、ソース オブジェクトはシンクの一連のメンバー関数へのポインターを取得します。 たとえば、シンクが実装しているイベントを発生させるには、ソースはシンク実装の適切なメソッドを呼び出します。
既定では、COleControl-派生クラスには、2 つの接続ポイントを実装しています。イベントとプロパティ変更通知。 一方の接続でイベントを発生させ、もう一方の接続でプロパティの値の変更をシンク (コントロールのコンテナーなど) に通知します。 また、OLE コントロール用にさらにコネクション ポイントを用意することもできます。 コントロール クラスに実装する追加コネクション ポイントごとに、"接続部" を宣言する必要があります。接続部がコネクション ポイントを実装します。 1 つ以上のコネクション ポイントを実装するときは、コントロール クラスごとに 1 つの "接続マップ" も宣言する必要があります。
簡単なコネクション マップと 1 つの接続ポイントを次の例を示します、Sampleのコードの 2 つの断片で構成される、OLE コントロール。最初の部分には、コネクション マップとポイントを宣言; 2 番目には、このマップとポイントを実装します。 プログラムの前半はコントロール クラスの宣言中の 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