Share via


COM クラス オブジェクトと CLSID

COM サーバーは COM クラスとして実装されます。 COM クラスは、特定のオブジェクトと対話するたびに実行されるコード内のインターフェイスのグループの実装です。 C++ クラスと COM クラスには重要な違いがあります。C++ ではクラスは型ですが、COM クラスは単にオブジェクトの定義であり、型を持たないものですが、C++ プログラマは C++ クラスを使用して実装できます。 COM は、特定のクラスの存在を知らずに記述されたアプリケーションを含め、さまざまなアプリケーションでクラスを使用できるように設計されています。 したがって、特定の種類のオブジェクトのクラス コードは、動的リンク ライブラリ (DLL) または別の実行可能アプリケーション (EXE) に存在します。

各 COM クラスは、サーバーが登録する必要がある一意の 128 ビット GUID である CLSID によって識別されます。 COM は、クライアントの要求に応じてこの CLSID を使用して、クラスを実装するコードを含む DLL または EXE に特定のデータを関連付け、オブジェクトのインスタンスを作成します。

同じコンピューター上のクライアントとサーバーの場合、サーバーの CLSID は、これまで必要とするすべてのクライアントです。 各コンピューターで、COM メインシステムにインストールされているすべての CLSID のデータベース (Microsoft Windows および Macintosh プラットフォーム上のシステム レジストリを利用) が含まれます。 これは、各 CLSID と、その CLSID のコードを収容する DLL または EXE の場所との間のマッピングです。 COM は、クライアントが COM クラスのインスタンスを作成してそのサービスを使用する場合は常に、このデータベースを参照するため、クライアントはコンピューター上のコードの絶対位置を知る必要はありません。

分散システムの場合、COM は、リモート サーバーがクライアントで使用するために自身を登録できるようにするレジストリ エントリを提供します。 アプリケーションはサーバーの CLSID のみを認識する必要があります。これは、サーバーを見つけるためにレジストリに依存できるためです。COM を使用すると、クライアントはレジストリ エントリをオーバーライドし、サーバーの場所を指定して、ネットワークを最大限に活用できます。 (「 リモート オブジェクトの検索。)

クラスのインスタンスを作成する基本的な方法は、COM クラス オブジェクトを使用することです。 これは単に、特定のクラスの新しいインスタンスの作成に共通する関数をサポートする中間オブジェクトです。 CLSID からオブジェクトを作成するために使用されるほとんどのクラス オブジェクトは、重要な CreateInstance メソッドを含むインターフェイスである IClassFactory インターフェイスをサポートします。 インスタンス化を提供する オブジェクトの各クラスに IClassFactory インターフェイスを実装します。 (実装の詳細については、IClassFactory については、「IClassFactory の実装」を参照してください)。

Note

他のカスタム クラス ファクトリ インターフェイスをサポートするサーバーは、特に IClassFactory をサポートするために必要ありません。 ただし、CoGetClassObject 以外のアクティブ化関数 (CoCreateInstanceEx など) を呼び出すには、サーバーで IClassFactory がサポートされている必要があります。

 

クライアントは、サーバーのオブジェクトのインスタンスを作成する場合、CoGetClassObject の 呼び出しで目的のオブジェクトの CLSID を使用します。 (この呼び出しは、オブジェクト作成ヘルパー関数の 1 つを介して直接または暗黙的に指定できます)。この関数は、CLSID に関連付けられているコードを検索し、クラス オブジェクトを作成し、要求されたインターフェイスへのポインターを提供します。 (CoGetClassObject は、クライアントの 目的のインターフェイス ポインターを指定する riid パラメーターを受け取ります)。

Note

COM には、他の多くの関数が構築されている関数がいくつかあります。 これらの中で最も重要なのは、すべての インスタンス作成関数の基になる CoGetClassObject でしょう。

 

このポインターを使用すると、呼び出し元はオブジェクトのインスタンスを作成し、オブジェクトの要求されたインターフェイスへのポインターを取得できます。 これは通常、初期化インターフェイスであり、オブジェクトをアクティブ化するために使用されます (実行中の状態に置きます)。これにより、クライアントは必要なオブジェクトを操作できます。 COM の基本的な関数を使用して、クライアントはすべてのオブジェクト ポインターを解放するようにも注意する必要があります。

オブジェクト インスタンスをアクティブ化するためのもう 1 つのメカニズムは、クラス モニカーを使用することです。 クラス モニカーは、作成されるクラスのクラス オブジェクトにバインドされます。 詳細については、 クラスを参照してください。

COM には、オブジェクト インスタンスの作成作業を減らすいくつかのヘルパー関数が用意されています。 これらは、インスタンス作成ヘルパー関数説明されています。

クラス オブジェクトを使用したオブジェクトの作成