集約(COM)
COM の基礎:インデックス への移動
サーバー オブジェクトが別の COM オブジェクトを利用して、その機能をいくつか実行することがあります。たとえば、在庫管理オブジェクトが別個の請求書オブジェクトを利用して顧客請求書を処理するとしましょう。ただし、この在庫管理オブジェクトが請求書インターフェイスをクライアントに公開しようとすると、問題が生じます。つまり、在庫インターフェイスを備えているクライアントは QueryInterface を呼び出して請求書インターフェイスを取得できますが、請求書オブジェクトは作成されたときに在庫管理オブジェクトのことを知らず、QueryInterface の呼び出しに応えて在庫インターフェイスを返すことができません。請求書インターフェイスを備えているクライアントから在庫インターフェイスに戻ることはできません。
この問題を回避するために、一部の COM オブジェクトでは集約をサポートしています。在庫管理オブジェクトでは、請求書オブジェクトのインスタンスを作成するときに、自分自身の IUnknown インターフェイスのコピーを渡します。請求書オブジェクトでは、この IUnknown インターフェイスを使用して、サポートしていないインターフェイス(たとえば在庫インターフェイスなど)を要求するどのような QueryInterface 呼び出しでも処理できます。このような場合、これら 2 つのオブジェクトをまとめて集約と呼びます。請求書オブジェクトは集約の内部(または包含)オブジェクトと呼ばれ、在庫オブジェクトは外部オブジェクトと呼ばれます。
メモ: COM オブジェクトが集約の外部オブジェクトとなるには、その COM オブジェクトで Windows API の CoCreateInstance または CoCreateInstanceEx を使って内部オブジェクトを作成する必要があります。その際に、オブジェクトは、内部オブジェクトで QueryInterface の呼び出しに使用できる自分自身の IUnknown ポインタをパラメータとして渡さなければなりません。
集約の内部オブジェクトとして機能できるオブジェクトを作成するには、System.TContainedObject から派生させます。このオブジェクトが作成されるとき、外部オブジェクトの IUnknown インターフェイスがコンストラクタに渡されます。その結果、内部オブジェクトで処理できない呼び出しの際に QueryInterface メソッドでこのインターフェイスを使用できるようになります。