次の方法で共有


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

サーバーは、それぞれの InprocServer32InprocHandler32、およびレジストリ内の LocalServer32 キー、DLL または EXE モジュールのインストール場所への完全なパスを登録する必要があります。 モジュール パスは、GetModuleFileName 関数を使用して簡単に取得できます。

サービス アプリケーションとしてのインストール

インストール でのクラスの登録

実行中の EXE サーバー の登録の

ROT でのオブジェクトの登録の