レジストリへの登録機能 ~ 作ってわかる COM の基礎

単純な COM コンポーネントを構成する要素と役割

さて、ここでは非常に単純だけれども、基本的な構成要素を備える完全な COM コンポーネントを作成します。 これを DLL で実装しますが、次の要素を含みます。

  • Car クラスの ICar の実装 ~ Car クラス特有の機能を実装する
  • Car クラスの IUnknown の実装
  • 寿命管理機能
  • クラスファクトリの実装
  • レジストリへの登録機能

ここで新たに 「レジストリへの登録」 と「クラスファクトリ」 というトピックが出てきました。 それぞれについて説明しましょう。

レジストリへの登録機能

COM の機能を利用するためには、COM のクラス ID をレジストリに登録します。

COM+ では RegDB という COM+ の登録用データベースに登録することになりますが、 ここでは「基本形」としてレジストリに登録すればよいということを覚えてください。 COM+ についてはまた別の機会にお話しますが、基礎となる COM を知らないとどこが違うか分らないと思います。

さて、「レジストリに登録する」 と言っても、どんなレジストリエントリを構成すればよいのでしょうか。
今回構成するレジストリとその意味は次のとおりです。

HKEY_CLASSES_ROOT
キー値の名前
CLSID\{GUID}(Default)説明文
CLSID\{GUID}\InprocServer32(Default)DLL のパス
CLSID\{GUID}\InprocServer32ThreadingModelスレッディングモデル
CLSID\{GUID}\ProgID(Default)プログラム識別子
プログラム識別子(Default)説明文
プログラム識別子\CLSID(Default){GUID}

レジストリをこのように構成しておくことによって、 例えば 「クラス ID が {0069c1ec-3242-4e30-b7c2-0f5cc3a19453} である、COM コンポーネントを実装する DLL をロードしたい!」 と思ったときに、レジストリの HKEY_CLASSES_ROOT\CLSID\{0069c1ec-3242-4e30-b7c2-0f5cc3a19453}\InprocServer32 の値から DLL のパスを取得することができ、 その DLL をロードすることができます。

ここで出てきたプログラム識別子 というのは、COM コンポーネントの名前と考えれば良いです。

COM システム内部では、 COM のクラスやインターフェイスを識別するために世界で一意の GUID を利用します。 しかしながら、GUID は長ったらしくて覚えにくいものですから、便宜上名前を付けることができるのです。 そこで使うのがプログラム識別子 (ProgID) です。

COM コンポーネント DLL をレジストリに登録するために、次のようなコマンドを実行したことがある人もいると思います。

> regsvr32 foo.dll

実はこのコマンドを実行すると foo.dll をロードし、その中の DllRegisterServer という関数が呼び出されます。 従って DllRegisterServer 関数の中にレジストリのへの登録コードを記述しておけば、COM コンポーネントがレジストリへ登録されます。

また、登録を解除するためには次のようなコマンドを実行します。

> regsvr32 /u foo.dll

この場合は登録と逆で DllUnregisterServer という関数が呼び出されます。 従って DllUnregisterServer にレジストリの登録を削除するコードを書いておけば、 登録が解除されます。

« 前の記事 次の記事 »
COM オブジェクトの寿命管理 クラスファクトリ

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説