接続可能オブジェクトのアーキテクチャ
接続可能オブジェクトは、接続可能なオブジェクトの全体的なアーキテクチャの 1 つのみです。 このテクノロジには、次の要素が含まれます。
- 接続可能なオブジェクト。 IConnectionPointContainer インターフェイスを実装します。は、少なくとも 1 つの接続ポイント オブジェクトを作成します。は、クライアントの発信インターフェイスを定義します。
- クライアント。 IConnectionPointContainer のオブジェクトを照会して、オブジェクトが接続可能かどうかを判断します。は、接続可能なオブジェクトによって定義された出力インターフェイスを実装するシンク オブジェクトを作成します。
- シンク オブジェクト。 送信インターフェイスを実装します。接続可能オブジェクトへの接続を確立するために使用されます。
- 接続ポイント オブジェクト。 IConnectionPoint インターフェイスを実装し、クライアントのシンクとの接続を管理します。
次の図は、クライアント、接続可能なオブジェクト、接続ポイント、シンクの関係を示しています。
接続ポイント オブジェクトは、前の図の手順 3 でシンク インターフェイスのメソッドを呼び出す前に、Advise メソッドへの手順 2 の呼び出しでポインターが既に渡されている場合でも、必要な特定のインターフェイスの QueryInterfaceをする必要があります。
このアーキテクチャには 2 つの列挙子オブジェクトも関係していますが、図には示されていません。 1 つは、IConnectionPointContainer のメソッドによって作成され、接続可能なオブジェクト内の接続ポイントを列挙します。 もう 1 つは、IConnectionPoint のメソッドによって作成され、その接続ポイントに現在確立されている接続を列挙します。 1 つの接続ポイントで複数の接続済みシンク インターフェイスをサポートでき、そのインターフェイスでメソッド呼び出しを行うたびに接続の一覧を反復処理する必要があります。 このプロセスはマルチキャストと呼ばれます。
接続可能なオブジェクトを操作する場合、接続可能なオブジェクト、各接続ポイント、各シンク、およびすべての列挙子は、個別の IUnknown 実装、個別の参照カウント、および個別の有効期間を持つ個別のオブジェクトであることを理解することが重要です。 これらのオブジェクトを使用するクライアントは、所有するすべての参照カウントを解放する役割を常に担います。
手記
接続可能なオブジェクトは、複数のクライアントをサポートでき、クライアント内で複数のシンクをサポートできます。 同様に、シンクは複数の接続可能なオブジェクトに接続できます。
クライアントと接続可能オブジェクトの間の接続を確立する手順は次のとおりです。
- クライアントは、IConnectionPointContainer のクエリをオブジェクトに して、オブジェクトが接続可能かどうかを判断します。 この呼び出しが成功した場合、クライアントは接続可能なオブジェクトの IConnectionPointContainer インターフェイスへのポインターを保持し、接続可能なオブジェクト参照カウンターがインクリメントされます。 それ以外の場合、オブジェクトは接続できず、送信インターフェイスはサポートされません。
- オブジェクトが接続可能な場合、クライアントは次に、接続可能なオブジェクト内の接続ポイント上の IConnectionPoint インターフェイスへのポインターを取得しようとします。 このポインターを取得する方法は、IConnectionPointContainer::FindConnectionPoint と IConnectionPointContainer::EnumConnectionPointsの両方にあります。 EnumConnectionPoints 使用する場合は、追加の手順がいくつか必要です。 (詳細については、「IConnectionPointContainer の使用」を参照してください)。成功した場合、接続可能なオブジェクトとクライアントはどちらも同じ発信インターフェイスをサポートします。 接続可能なオブジェクトはそれを定義して呼び出し、クライアントはそれを実装します。 クライアントは、接続可能なオブジェクト内の接続ポイントを介して通信できます。
- その後、クライアントは接続ポイント アドバイズ を呼び出して、シンク インターフェイスとオブジェクトの接続ポイント間の接続を確立します。 この呼び出しの後、オブジェクトの接続ポイントはシンク上の発信インターフェイスへのポインターを保持します。
- Advise 内のコードは、渡されたインターフェイス ポインター QueryInterface を呼び出し、接続先の特定のインターフェイス識別子を要求します。
- オブジェクトは、必要に応じて、その接続ポイントによって保持されているポインターを使用して、シンクのインターフェイスでメソッドを呼び出します。
- クライアントは Unadvise呼び出して接続を終了します。 次に、クライアントは IConnectionPoint::Release を呼び出して、接続ポイントの保留を解除します。したがって、メインの接続可能オブジェクトも解放されます。 また、クライアントは IConnectionPointContainer::Release 呼び出して、メインの接続可能なオブジェクトの保留を解放する必要があります。
関連トピック