Share via


COM ライブラリ

COM を使用するすべてのプロセスは、COM ライブラリを初期化および初期化解除する必要があります。 COM では、仕様に加えて、このライブラリのいくつかの重要なサービスも実装しています。 Microsoft Windows の DLL と EXEs (主にOle32.dllとRpcss.exe) のセットとして提供される COM ライブラリには、次のものが含まれます。

  • クライアントとサーバーの両方の COM アプリケーションの作成を容易にする少数の基本的な関数。 クライアントの場合、COM にはオブジェクトを作成するための基本的な関数が用意されています。 サーバーの場合、COM はオブジェクトを公開する手段を提供します。

  • COM が一意のクラス識別子 (CLSID) から、そのクラスを実装し、そのサーバーが配置されている場所を決定する実装ロケーター サービス。 このサービスには、クライアントがパッケージ化に依存しないように、オブジェクト クラスの ID と実装のパッケージ化の間の間接参照のレベル (通常はシステム レジストリ) のサポートが含まれています。これにより、クライアントは将来変更される可能性があります。

  • オブジェクトがローカル サーバーまたはリモート サーバーで実行されている場合、透過的なリモート プロシージャ呼び出し。

  • アプリケーションがプロセス内でのメモリの割り当て方法を制御できるようにする標準的なメカニズム。特に、適切に解放できるように、連携するオブジェクト間で渡す必要があるメモリ。

基本的な COM サービスを使用するには、クライアントおよびアウトプロセス サーバーで実行されるすべての COM スレッドが、メモリ割り当て呼び出しを除く他の COM 関数を呼び出す前に、 CoInitialize 関数または CoInitializeEx 関数を呼び出す必要があります。 CoInitializeEx はもう一方の関数を置き換え、スレッドのスレッド モデル (アパートメント スレッドまたはフリー スレッド) を指定できるパラメーターを追加します。 CoInitialize を呼び出すと、スレッド モデルがアパートメント スレッドに設定されます。

OLE 複合ドキュメント アプリケーションは、 OleInitialize 関数を呼び出します。この関数は CoInitializeEx を呼び出し、複合ドキュメントに必要な初期化も行います。 したがって、 OleInitialize を呼び出すスレッドをフリー スレッドにすることはできません。 クライアントとサーバーでのスレッド処理の詳細については、「プロセス、スレッド、およびアパートメント」を参照してください。

インプロセス サーバーは初期化関数を呼び出しません。初期化関数は、既に実行されているプロセスに読み込まれているためです。 その結果、インプロセス サーバーは、 InprocServer32 キーの下のレジストリにスレッド モデルを設定する必要があります。 インプロセス サーバーでのスレッドの問題の詳細については、「インプロセス サーバースレッドの問題」を参照してください。

ライブラリの初期化を解除することも重要です。 CoInitialize または CoInitializeEx の呼び出しごとに、 CoUninitialize への対応する呼び出しが必要です。 OleInitialize の呼び出しごとに、 OleUninitialize への対応する呼び出しが必要です。

インプロセス サーバーは、読み込まれているプロセスが既にこれらの手順を実行していると想定できます。

コンポーネント オブジェクト モデル