IConnectionPointContainerの使用
接続可能なオブジェクトは、 IConnectionPointContainer を実装し (QueryInterface を介して公開します)、発信インターフェイスの存在を示します。 送信インターフェイスごとに、接続可能なオブジェクトは、それ自体が IConnectionPoint を実装する接続ポイント のサブオブジェクトを管理します。 したがって、接続可能なオブジェクトには接続ポイントが含まれているため、 IConnectionPointContainer と IConnectionPoint の名前が付けられます。
IConnectionPointContainer を使用して、クライアントは 2 つの操作を実行できます。 まず、クライアントがサポートする送信インターフェイスの IID を既に持っている場合は、 IConnectionPointContainer::FindConnectionPoint を使用して IID の対応する接続ポイントを見つけることができます。 接続可能なオブジェクトとその包含接続ポイントの間のコンテナー/包含関係のため、クライアントは接続ポイントを直接照会できません。 基本的に、 FindConnectionPoint は、IID が クライアントに認識されている場合の発信インターフェイスの QueryInterface です。
次に、クライアントは IConnectionPointContainer::EnumConnectionPoints を使用して、接続可能なオブジェクト内のすべての接続ポイントを列挙できます。 このメソッドは、個別の 列挙子オブジェクトの IEnumConnectionPoints インターフェイス ポインターを返します。 IEnumConnectionPoints::Next を使用して、クライアントは各接続ポイントへの IConnectionPoint インターフェイス ポインターを取得できます。
クライアントは、 IConnectionPoint インターフェイスを取得した後、IConnectionPoint::GetConnectionInterface を呼び出して、各接続ポイントでサポートされている送信インターフェイスの IID を決定する必要があります。 クライアントがその送信インターフェイスを既にサポートしている場合は、接続を確立できます。 それ以外の場合でも、接続可能なオブジェクトのタイプ ライブラリからの情報を使用して実行時にサポートを提供することで、送信インターフェイスをサポートできる場合があります。 この手法では、接続可能なオブジェクトが IProvideClassInfo インターフェイスをサポートしている必要があります。 (「IProvideClassInfo の使用」を参照してください。)
列挙子は別のオブジェクトであるため、列挙子が不要になったら、クライアントは IEnumConnectionPoints::Release を呼び出す必要があります。 さらに、各接続ポイントは、含まれている接続可能なオブジェクトとは別の参照カウントを持つオブジェクトです。 そのため、クライアントは、列挙子または FindConnectionPoint を介して アクセスされる各接続ポイントに対して IConnectionPoint::Release も呼び出す必要があります。
関連トピック