Self-Registration
コンポーネント ソフトウェアが市場として成長し続けるにつれて、オンライン サービスから新しいコンポーネントをダウンロードするときやフロッピー ディスク上の友人からコンポーネントを受け取る場合など、ユーザーが新しいソフトウェア コンポーネントを単一の DLL または EXE モジュールとして取得するインスタンスが増えます。 このような場合、長いインストール手順またはセットアップ プログラムをユーザーに要求することは現実的ではありません。 IClassFactory2で処理されるライセンスの問題に加えて、インストール手順では通常、COM および OLE コンテキストでコンポーネントを適切に実行するために必要なレジストリ エントリが作成されます。
自己登録は、サーバー モジュールが独自のレジストリ操作 (登録と登録解除の両方) をモジュール自体にパッケージ化できる標準的な手段です。 IClassFactory2を介して処理されるライセンスと共に使用すると、サーバーは、外部インストール プログラムや.reg ファイルを必要とせず、完全に自己完結型のモジュールになる可能性があります。
次に示すように、自己登録モジュール DLL または EXE は、まず、バージョン情報リソースの StringFileInfo セクションに "OleSelfRegister" 文字列を含める必要があります。
VS_VERSION_INFO VERSIONINFO
...
BEGIN
BLOCK "StringFileInfo"
BEGIN
#ifdef UNICODE
BLOCK "040904B0" // Lang=US English, CharSet=Unicode
#else
BLOCK "040904E4" // Lang=US English, CharSet=Windows Multilingual
#endif
BEGIN
...
VALUE "OLESelfRegister", "\0"
END
...
END
...
END
このデータが存在すると、この新しいコンポーネントを統合するアプリケーションなどの関係者は、最初に DLL または EXE を読み込む必要なく、サーバーが自己登録をサポートしているかどうかを判断できます。
サーバーが DLL モジュールにパッケージ化されている場合、DLL は DllRegisterServer関数をエクスポートし、DllUnregisterServerする必要があります。 自身を登録するようにサーバーに指示するすべてのアプリケーション (つまり、そのすべての CLSID とタイプ ライブラリ ID) は、GetProcAddress 関数を介して dllRegisterServer へのポインターを取得できます。 DllRegisterServer内で、DLL は必要なすべてのレジストリ エントリを作成し、すべての InprocServer32 または InprocHandler32 エントリの DLL への正しいパスを格納します。
アプリケーションがシステムからコンポーネントを削除する場合は、DllUnregisterServer呼び出して、そのコンポーネントの登録を解除する必要があります。 この呼び出しの中で、サーバーは以前に dllRegisterServerで作成したエントリ正確に削除します。 他のソフトウェアが追加のエントリ (TreatAs キーなど) を格納している可能性があるため、サーバーはクラスのすべてのエントリを盲目的に削除しないでください。
サーバーが EXE モジュールにパッケージ化されている場合、サーバーを登録するアプリケーションは、/RegServer または -RegServer (大文字と小文字を区別しない) コマンドライン引数を使用して EXE サーバーを起動します。 アプリケーションがサーバーの登録を解除する場合は、/UnregServer または -UnregServer コマンドライン引数を使用して EXE を起動します。 自己登録 EXE は、これらのコマンド ライン引数を検出し、dllRegisterServer 内の DLL と DllUnregisterServerの場合と同じ操作を呼び出します。それぞれ、LocalServer32 の下にモジュール パスを登録します。InprocServer32 または InprocHandler32 。
サーバーは、それぞれの InprocServer32、InprocHandler32、およびレジストリ内の LocalServer32 キー、DLL または EXE モジュールのインストール場所への完全なパスを登録する必要があります。 モジュール パスは、GetModuleFileName 関数を使用して簡単に取得できます。
関連トピック
-
インストール でのクラスの登録
-
実行中の EXE サーバー の登録の
-
ROT でのオブジェクトの登録の