次の方法で共有


オブジェクトへのポインターの取得

COM には厳密なクラス モデルがないため、クライアントがオブジェクト上のインターフェイスをインスタンス化またはポインターを取得するには、次の 4 つの方法があります。

  • 事前に定義された型のオブジェクトを作成する COM ライブラリ関数を呼び出します。つまり、この関数は、特定のオブジェクト クラスに対して 1 つの特定のインターフェイスへのポインターのみを返します。
  • クラス識別子 (CLSID) に基づいてオブジェクトを作成でき、要求された任意の型のインターフェイス ポインターを返す COM ライブラリ関数を呼び出します。
  • 別のオブジェクトを作成する (または既存のオブジェクトに接続する) インターフェイスのメソッドを呼び出し、その個別のオブジェクトにインターフェイス ポインターを返します。
  • 他のオブジェクトがインターフェイス ポインターをクライアントに直接渡すインターフェイスを持つオブジェクトを実装します。

最初のインターフェイスを取得した後にオブジェクト上の他のインターフェイスへのポインターを取得する方法については、「QueryInterface: オブジェクト内を移動する」を参照してください。

事前に定義された型のオブジェクトの作成

CoGetMallocなど、特定のインターフェイス実装へのポインターを返す多数の COM 関数があります。 (CoGetMalloc は、標準の COM メモリ アロケーターへのポインターを取得します。これらの関数のほとんどはヘルパー関数であり、これらの関数のほとんどは、ストレージやデータ転送など、関連する特定の領域の下で、このドキュメントのリファレンス セクションで説明されています。

CLSID に基づくオブジェクトの作成

CLSID を指定すると、クライアントがオブジェクト インスタンスを作成してポインターを取得するために呼び出すことができる関数がいくつかあります。 これらの関数はすべて、CoGetClassObject関数に基づいています。これにより、クラス オブジェクトが作成され、そのクラスのインスタンスを作成できるインターフェイスへのポインターが提供されます。 サーバーが存在するシステムを示す情報が必要ですが、その情報をクライアントに含める必要はありません。 クライアントは CLSID のみを認識する必要があり、サーバー コードの絶対パスを認識する必要はありません。 詳細については、「クラス オブジェクトを使用したオブジェクトの作成」を参照してください。

個別のオブジェクトへのポインターを返す

別のオブジェクトへのポインターを返す多くのインターフェイス メソッドの中には、列挙子オブジェクトへのポインターを作成して返すメソッドがあります。これにより、オブジェクトが保持する特定の型の項目の数を決定できます。 COM は、文字列、重要な構造体、モニカー、IUnknown インターフェイス ポインターなど、さまざまな項目を列挙するためのインターフェイスを定義します。 列挙子インスタンスを作成してそのインターフェイスへのポインターを取得する一般的な方法は、別のインターフェイスからメソッドを呼び出す方法です。 たとえば、IDataObject インターフェイスは、2 つの異なる列挙オブジェクト上のインターフェイスへのポインターを返す、EnumDAdviseEnumFormatEtc2 つのメソッドを定義します。 オブジェクトへのポインターを返すメソッドの COM には他にも多くの例があります。たとえば、OLE 複合ドキュメント インターフェイス IOleObject::GetClientSiteなどです。このメソッドは、埋め込みオブジェクトまたはリンクされたオブジェクトで呼び出されると、コンテナー オブジェクトの IOleClientSiteの実装へのポインターを返します。

インターフェイス ポインターをクライアントに直接渡すオブジェクトの実装

OLE 複合ドキュメント コンテナーやサーバーなどの 2 つのオブジェクトが双方向通信を必要とする場合、それぞれがインターフェイス メソッドを含むオブジェクトを実装し、インターフェイス ポインターを他のオブジェクトに渡すことができます。 作成されたオブジェクトのクライアントでもある実装オブジェクトは、メソッドを呼び出して渡されたポインターを取得できます。

COM クライアントとサーバー

COM サーバーの責任