COM クラス オブジェクトと CLSID
COM サーバーは COM クラスとして実装されます。 COM クラス は、特定のオブジェクトと対話するたびに実行されるコード内のインターフェイスのグループの実装です。 C++ クラスと COM クラスには重要な違いがあります。C++ ではクラスは型ですが、COM クラスは単にオブジェクトの定義であり、型を持たないものですが、C++ プログラマは C++ クラスを使用して実装できます。 COM は、特定のクラスの存在を知らずに記述されたアプリケーションを含め、さまざまなアプリケーションでクラスを使用できるように設計されています。 したがって、特定の種類のオブジェクトのクラス コードは、動的リンク ライブラリ (DLL) または別の実行可能アプリケーション (EXE) に存在します。
各 COM クラスは、CLSID(サーバーが登録する必要がある一意の 128 ビット GUID) によって識別されます。 COM は、クライアントの要求に応じてこの CLSID を使用して、クラスを実装するコードを含む DLL または EXE に特定のデータを関連付け、オブジェクトのインスタンスを作成します。
同じコンピューター上のクライアントとサーバーの場合、サーバーの CLSID は、これまで必要とするすべてのクライアントです。 各コンピューターで、COM はシステムにインストールされているすべての CLSID のデータベース (Microsoft Windows および Macintosh プラットフォーム上のシステム レジストリを利用) を維持します。 これは、各 CLSID と、その CLSID のコードを収容する DLL または EXE の場所との間のマッピングです。 COM は、クライアントが COM クラスのインスタンスを作成してそのサービスを使用する場合は常に、このデータベースを参照するため、クライアントはコンピューター上のコードの絶対位置を知る必要はありません。
分散システムの場合、COM は、リモート サーバーがクライアントで使用するために自身を登録できるようにするレジストリ エントリを提供します。 アプリケーションはサーバーの CLSID のみを認識する必要があります。これは、サーバーを見つけるためにレジストリに依存できるためです。COM を使用すると、クライアントはレジストリ エントリをオーバーライドし、サーバーの場所を指定して、ネットワークを最大限に活用できます。 (リモート オブジェクト の検索を参照してください)。
クラスのインスタンスを作成する基本的な方法は、COM クラス オブジェクトを使用することです。 これは単に、特定のクラスの新しいインスタンスの作成に共通する関数をサポートする中間オブジェクトです。 CLSID からオブジェクトを作成するために使用されるほとんどのクラス オブジェクトは、IClassFactory インターフェイスをサポートします。これは、CreateInstanceメソッド重要なインターフェイスです。 インスタンス化を提供するオブジェクトの各クラスに対して、IClassFactory インターフェイスを実装します。 (IClassFactoryの実装の詳細については、「IClassFactoryの実装」を参照してください)。
手記
その他のカスタム クラス ファクトリ インターフェイスをサポートするサーバーは、特に IClassFactoryサポートする必要はありません。 ただし、CoGetClassObject 以外のアクティブ化関数 (CoCreateInstanceExなど) を呼び出すには、サーバーが IClassFactory サポートする必要があります。
クライアントは、サーバーのオブジェクトのインスタンスを作成する場合、CoGetClassObjectをする呼び出しで目的のオブジェクトの CLSID を使用します。 (この呼び出しは、オブジェクト作成ヘルパー関数の 1 つを介して直接または暗黙的に指定できます)。この関数は、CLSID に関連付けられているコードを検索し、クラス オブジェクトを作成し、要求されたインターフェイスへのポインターを提供します。 (CoGetClassObject は、クライアントの目的のインターフェイス ポインターを指定する riid パラメーターを受け取ります。
手記
COM には、他の多くの関数が構築されている関数がいくつかあります。 これらの中で最も重要なのは、すべてのインスタンス作成関数の基になる CoGetClassObjectである可能性があります。
このポインターを使用すると、呼び出し元はオブジェクトのインスタンスを作成し、オブジェクトの要求されたインターフェイスへのポインターを取得できます。 これは通常、初期化インターフェイスであり、オブジェクトをアクティブ化するために使用されます (実行中の状態に置きます)。これにより、クライアントは必要なオブジェクトを操作できます。 COM の基本的な関数を使用して、クライアントはすべてのオブジェクト ポインターを解放するようにも注意する必要があります。
オブジェクト インスタンスをアクティブ化するためのもう 1 つのメカニズムは、クラス モニカーを使用することです。 クラス モニカーは、作成されるクラスのクラス オブジェクトにバインドされます。 詳細については、「クラス モニカー」を参照してください。
COM には、オブジェクト インスタンスの作成作業を減らすいくつかのヘルパー関数が用意されています。 これらは、インスタンス作成ヘルパー関数で説明されています。
関連トピック
-
クラス オブジェクト を使用してオブジェクトを作成する