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