レジストリへの登録機能 ~ 作ってわかる 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}\InprocServer32 | ThreadingModel | スレッディングモデル | |
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 オブジェクトの寿命管理 | クラスファクトリ |