CConnectionPoint クラス
他の OLE オブジェクトと通信するために使われる "コネクション ポイント" と呼ばれる特別な型のインターフェイスを定義します。
構文
class CConnectionPoint : public CCmdTarget
メンバー
パブリック コンストラクター
名前 | 説明 |
---|---|
CConnectionPoint::CConnectionPoint | CConnectionPoint オブジェクトを構築します。 |
パブリック メソッド
名前 | 説明 |
---|---|
CConnectionPoint::GetConnections | 接続マップ内のすべての接続ポイントを取得します。 |
CConnectionPoint::GetContainer | 接続マップを所有するコントロールのコンテナーを取得します。 |
CConnectionPoint::GetIID | 接続ポイントのインターフェイス ID を取得します。 |
CConnectionPoint::GetMaxConnections | コントロールでサポートされている接続ポイントの最大数を取得します。 |
CConnectionPoint::GetNextConnection | pos にある接続要素へのポインターを取得します。 |
CConnectionPoint::GetStartPosition | GetNextConnection 呼び出しに渡すことができる POSITION 値を返すことによって、マップの反復処理を開始します。 |
CConnectionPoint::OnAdvise | 接続を確立または中断するときにフレームワークによって呼び出されます。 |
CConnectionPoint::QuerySinkInterface | 要求されたシンク インターフェイスへのポインターを取得します。 |
解説
OLE コントロールの機能を実装および公開するために使用される通常の OLE インターフェイスとは異なり、接続ポイントは、イベントの発生や通知の変更など、他のオブジェクトに対するアクションを開始できる発信インターフェイスを実装します。
接続は、"ソース" と呼ばれるインターフェイスを呼び出すオブジェクトと、インターフェイスを実装するオブジェクト ("シンク" と呼ばれる) の 2 つの部分で構成されます。ソースは、接続ポイントを公開することで、シンクがそれ自体への接続を確立できるようにします。 接続ポイント メカニズムを使用して、ソース オブジェクトは、一連のメンバー関数のシンクの実装へのポインターを取得します。 たとえばシンクに実装されたイベントを発生させたければ、ソースは、シンクに実装されている適切なメソッドを呼び出すことができます。
既定では、 COleControl
派生クラスは、イベント用とプロパティ変更通知用の 2 つの接続ポイントを実装します。 これらの接続はそれぞれ、イベントの発生と、プロパティ値が変更されたときにシンク (コントロールのコンテナーなど) に通知するために使用されます。 OLE コントロールでは、追加の接続ポイントを実装するためのサポートも提供されています。 コントロール クラスに実装された追加の接続ポイントごとに、接続ポイントを実装する "接続部分" を宣言する必要があります。 1 つ以上の接続ポイントを実装する場合は、コントロール クラスで 1 つの "接続マップ" を宣言する必要もあります。
次の例では、単純な接続マップと、2 つのコードフラグメントで構成される、 Sample
OLE コントロール用の 1 つの接続ポイントを示します。最初の部分は接続マップとポイントを宣言し、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 マクロは、この特定の接続ポイントを実装する (CConnectionPoint
から派生した) XSampleConnPt
埋め込みクラスを宣言します。 CConnectionPoint
メンバー関数をオーバーライドする場合、または独自のメンバー関数を追加する場合は、これら 2 つのマクロの間でそれらを宣言します。 たとえば、CONNECTION_IID マクロは、これら 2 つのマクロの間に配置されたときに、 CConnectionPoint::GetIID
メンバー関数をオーバーライドします。
2 番目のコード フラグメントは、実装ファイル (.コントロール クラスの CPP)。 このコードでは、接続マップを実装します。これには、追加の接続ポイントが含 SampleConnPt
。
BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()
これらのコード フラグメントが挿入されると、サンプル OLE コントロールは、 ISampleSink
インターフェイスの接続ポイントを公開します。
通常、接続ポイントは"マルチキャスト" をサポートします。これは、同じインターフェイスに接続されている複数のシンクにブロードキャストする機能です。 次のコード フラグメントは、接続ポイントの各シンクを反復処理してマルチキャストを実行する方法を示しています。
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
の使用方法の詳細については、ポイントに関する記事を参照してください。
継承階層
CConnectionPoint
要件
ヘッダー : afxdisp.h
CConnectionPoint::CConnectionPoint
CConnectionPoint
オブジェクトを構築します。
CConnectionPoint();
CConnectionPoint::GetConnections
この関数を呼び出して、接続ポイントのすべてのアクティブな接続を取得します。
const CPtrArray* GetConnections();
戻り値
アクティブな接続 (シンク) の配列へのポインター。 配列内のポインターの一部が NULL である可能性があります。 この配列内の NULL 以外の各ポインターは、キャスト演算子を使用してシンク インターフェイスへのポインターに安全に変換できます。
CConnectionPoint::GetContainer
接続ポイントの IConnectionPointContainer
を取得するためにフレームワークによって呼び出されます。
virtual LPCONNECTIONPOINTCONTAINER GetContainer();
戻り値
成功した場合は、コンテナーへのポインター。それ以外の場合は NULL。
解説
この関数は通常、BEGIN_CONNECTION_PART マクロによって実装されます。
CConnectionPoint::GetIID
接続ポイントのインターフェイス ID を取得するためにフレームワークによって呼び出されます。
virtual REFIID GetIID() = 0;
戻り値
接続ポイントのインターフェイス ID への参照。
解説
この関数をオーバーライドして、この接続ポイントのインターフェイス ID を返します。
CConnectionPoint::GetMaxConnections
接続ポイントでサポートされている接続の最大数を取得するために、フレームワークによって呼び出されます。
virtual int GetMaxConnections();
戻り値
コントロールでサポートされる接続の最大数。制限がない場合は -1。
解説
既定の実装では、制限がないことを示す -1 が返されます。
コントロールに接続できるシンクの数を制限する場合は、この関数をオーバーライドします。
CConnectionPoint::GetNextConnection
pos にある接続要素へのポインターを取得します。
LPUNKNOWN GetNextConnection(POSITION& pos) const;
パラメーター
pos
前の GetNextConnection
またはGetStartPosition 呼び出しによって返される POSITION 値への参照 指定します。
戻り値
pos または NULL で指定された接続要素へのポインター。
解説
この関数は、接続マップ内のすべての要素を反復処理する場合に最も便利です。 反復処理を行うときは、この関数から返されるすべての NULL をスキップします。
例
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::GetStartPosition
GetNextConnection 呼び出しに渡すことができる POSITION 値を返すことによって、マップイテレーションを開始します。
POSITION GetStartPosition() const;
戻り値
マップを反復処理するための開始位置を示す POSITION 値。マップが空の場合は NULL。
解説
反復シーケンスは予測できません。そのため、"マップ内の最初の要素" には特別な意味はありません。
例
CConnectionPoint::GetNextConnection の例を参照してください。
CConnectionPoint::OnAdvise
接続が確立または切断されるときにフレームワークによって呼び出されます。
virtual void OnAdvise(BOOL bAdvise);
パラメーター
bAdvise
接続が確立されている場合は TRUE。それ以外の場合は FALSE。
解説
既定の実装では、何も行われません。
シンクが接続ポイントに接続するとき、または接続ポイントから切断されたときに通知する場合は、この関数をオーバーライドします。
CConnectionPoint::QuerySinkInterface
要求されたシンク インターフェイスへのポインターを取得します。
virtual HRESULT QuerySinkInterface(
LPUNKNOWN pUnkSink,
void** ppInterface);
パラメーター
pUnkSink
要求されるシンク インターフェイスの識別子。
ppInterface
pUnkSink によって識別されるインターフェイス ポインターへのポインター。 オブジェクトがこのインターフェイスをサポートしていない場合、* ppInterface は NULL に設定されます。
戻り値
標準の HRESULT 値。