インストール時のクラスの登録
ほとんどのアプリケーションと同様に、クラスをクライアントがいつでも使用できるようにする場合は、通常、インストールおよびセットアップ プログラムを通じてクラスを登録します。 これは、オブジェクトがどこでどのようにインスタンス化されるかなど、アプリケーションに関する情報をレジストリに入れることを意味します。 この情報は、すべての CLSID に登録する必要があります。 その他の情報は省略可能です。 Regsvr32 などのツールを使用すると、インストール時にサーバーを登録するセットアップ プログラムを簡単に作成できます。
システムの既定に依存していない場合、レジストリには CLSID と AppID という 2 つの重要なキーがあります。 これらのキーの下にある重要な情報には、オブジェクトをインスタンス化する方法が含まれます。 オブジェクトは、インプロセス、アウトプロセス ローカル、またはアウトプロセス リモートとして指定できます。
AppID キーの下には、そのアプリケーションに固有の情報を定義するいくつかの値があります。 これらの中には RemoteServerName と ActivateAtStorage があります。どちらも、クライアントがオブジェクトを作成できるようにするために使用でき、クライアントにはサーバーの場所に関する組み込みの知識がありません。 (リモート インスタンス化の詳細については、次を参照してください: 。リモート オブジェクト と インスタンス作成ヘルパー関数の検索。)
サーバーは、サービスとしてインストールすることも、特定のユーザー アカウントで実行することもできます。 詳細については、「サービスとしてのインストール アプリケーション」を参照してください。
サービスではない、または特定のユーザー アカウントで実行されているサーバーまたは ROT オブジェクトは、「アクティベータとしてアクティブ化」サーバーと呼ばれることがあります。 これらのサーバーの場合、クライアントのセキュリティ コンテキストとウィンドウ ステーション/デスクトップがサーバーのものと一致する必要があります。 リモート サーバーへの接続を試みるクライアントは NULL ウィンドウ ステーション/デスクトップを持つと見なされるため、このインスタンスではサーバー のセキュリティ コンテキストのみが比較されます。 (SID の詳細については、「COM のセキュリティ」を参照してください。) COM は、プロセスが最初に分散 COM サービスに接続するときに、プロセスのウィンドウ ステーション/デスクトップをキャッシュします。 したがって、COM クライアントとサーバーは、CoInitialize または CoInitializeEx を呼び出した後、プロセスのウィンドウ ステーションまたはスレッド デスクトップを変更しないでください。
クラスがインプロセスとして登録されると、クラス オブジェクトを作成するための CoGetClassObject の呼び出しは、COM によって DllGetClassObject 関数に自動的に渡されます。この関数は、呼び出し元のオブジェクトにクラス オブジェクトへのポインターを提供するためにクラスが実装する必要があります。
実行可能ファイルに実装されているクラスは、COM がプロセスを実行し、プロセスが CoRegisterClassObject 関数の呼び出しを介してクラス オブジェクトの IClassFactory インターフェイスを登録するまで待機するように指定できます。
関連トピック