オブジェクトへのポインタを取得する
COM には厳密なクラス モデルがないため、クライアントがオブジェクトのインターフェイスへのポインターをインスタンス化または取得するには、次の 4 つの方法があります。
- 所定の型のオブジェクトを作成する COM ライブラリ関数を呼び出します。つまり、この関数は、特定のオブジェクト クラスの 1 つの特定のインターフェイスのみへのポインターを返します。
- クラス識別子 (CLSID) に基づいてオブジェクトを作成でき、要求された任意の種類のインターフェイス ポインターを返す COM ライブラリ関数を呼び出します。
- 別のオブジェクトを作成し (または既存のオブジェクトに接続し)、その別のオブジェクトのインターフェイス ポインターを返すインターフェイスのメソッドを呼び出します。
- 他のオブジェクトがそのインターフェイス ポインタをクライアントに直接渡すためのインターフェイスを備えたオブジェクトを実装します。
最初のインターフェイスを取得した後にオブジェクト上の他のインターフェイスへのポインターを取得する方法については、「QueryInterface: オブジェクト内の移動」を参照してください。
事前に定義された型のオブジェクトの作成
特定のインターフェイス実装へのポインターを返す多くの COM 関数 (CoGetMalloc など) があります。 (CoGetMalloc は、標準の COM メモリ アロケーターへのポインターを取得します)。これらのほとんどはヘルパー関数であり、これらの関数のほとんどは、ストレージやデータ転送など、関連する特定の領域の下で、このドキュメントのリファレンス セクションで説明されています。
CLSID に基づくオブジェクトの作成
CLSID を指定すると、クライアントがオブジェクト インスタンスを作成し、そのインスタンスへのポインターを取得するために呼び出すことができる関数がいくつかあります。 これらの関数はすべて、クラス オブジェクトを作成し、そのクラスのインスタンスを作成できるインターフェイスへのポインターを提供する CoGetClassObject 関数に基づいています。 サーバーがどのシステムに存在するかを示す情報が必要ですが、その情報がクライアントに含まれている必要はありません。 クライアントは CLSID のみを知る必要があり、サーバー コードの絶対パスを知る必要はありません。 詳細については、「クラス オブジェクトを使用したオブジェクトの作成」を参照してください。
個別のオブジェクトへのポインターを返す
個別のオブジェクトへのポインターを返す多くのインターフェイス メソッドの中には、列挙子オブジェクト enumerator object へのポインターを作成して返すメソッドがいくつかあります。これにより、オブジェクトが保持する特定のタイプの項目の数を決定できます。 COM は、文字列、重要な構造体、モニカー、IUnknown インターフェイス ポインターなど、さまざまな項目を列挙するためのインターフェイスを定義します。 列挙子のインスタンスを作成し、そのインターフェイスへのポインターを取得する一般的な方法は、別のインターフェイスからメソッドを呼び出すことです。 たとえば、IDataObject インターフェイスは、2 つの異なる列挙オブジェクト上のインターフェイスへのポインターを返す EnumDAdvise と EnumFormatEtc という 2 つのメソッドを定義します。 オブジェクトへのポインターを返すメソッドの COM には他にも多くの例があります。たとえば、OLE 複合ドキュメント インターフェイス IOleObject::GetClientSite は、埋め込みオブジェクトまたはリンクされたオブジェクトで呼び出されると、コンテナー オブジェクトの IOleClientSite の実装へのポインターを返します。
インターフェイス ポインターをクライアントに直接渡すためのオブジェクトの実装
OLE 複合ドキュメント コンテナとサーバーなどの 2 つのオブジェクトが双方向コミュニケーションを必要とする場合、それぞれのオブジェクトは、他のオブジェクトにインターフェイス ポインターを渡すためのインターフェイス メソッドを含むオブジェクトを実装します。 作成されたオブジェクトのクライアントでもある実装オブジェクトは、メソッドを呼び出して、渡されたポインターを取得できます。
関連トピック