web-dev-qa-db-ja.com

RegSvrとRegServerの違いは何ですか?

/RegServerおよび/RegSvr同じか異なるか、異なる場合はなぜ/どのように?

たとえば、私はこのスタイルを見てきました(32ビットOSの例):

RegSvr32 COM.exe

または

RegSvr32 COM.dll

または、代替手段として(64ビットOS上にあった):

COM.exe /RegServer
COM.exe /RegSvr

これらの異なるアプローチは同じことをしていますか?

12
Rahul

COMサーバーは、32ビット64ビットオペレーティングシステムでも同じ方法で登録されます。この質問は、COMサーバーを登録する最も簡単な方法である自己登録に関連しています。サーバーにHKLM/HKCRレジストリをそれぞれ更新するように依頼します。

DLLを直接実行することはできないため、ヘルパーregsvr32アプリケーションを使用します。長い話を短くするために、DLLが32であるか、または64ビットで、それぞれのバージョンのアプリケーションを使用します。次に、DLLをロードし、制御を渡して登録を行います。

EXE COMサーバーは直接実行できるため、これを使用して/ regserverまたは/ unregserverパラメーターを渡します。

この方法は、32ビットおよび64ビットのCOMサーバー、32ビットおよび64ビットのオペレーティングシステムに有効です。

さらに読む- 自己登録

サーバーがDLLモジュールにパッケージ化されている場合、DLLは関数DllRegisterServerおよびDllUnregisterServerをエクスポートする必要があります。サーバーに自身を登録するように指示するアプリケーション(つまり、すべてのCLSIDとタイプライブラリID)は、GetProcAddress関数を介してDllRegisterServerへのポインタを取得できます。DllRegisterServer内で、DLLは、必要なすべてのレジストリエントリを作成し、=への正しいパスを格納します。 DLLすべてのInprocServer32またはInprocHandler32エントリ。

アプリケーションがシステムからコンポーネントを削除したい場合は、DllUnregisterServerを呼び出してそのコンポーネントの登録を解除する必要があります。この呼び出し内で、サーバーはDllRegisterServerで以前に作成したエントリを正確に削除します。他のソフトウェアがTreatAsキーなどの追加のエントリを保存している可能性があるため、サーバーはそのクラスのすべてのエントリを盲目的に削除しないでください。

サーバーがEXEモジュールにパッケージ化されている場合、サーバーの登録を希望するアプリケーションは、コマンドライン引数/ RegServerまたは-RegServer(大文字と小文字を区別しない)を使用してEXEサーバーを起動します。アプリケーションがサーバーの登録を解除したい場合は、コマンドライン引数/ UnregServerまたは-UnregServerを使用してEXEを起動します。自己登録EXEは、これらのコマンドライン引数を検出し、DLLがそれぞれDllRegisterServerおよびDllUnregisterServer内で行うのと同じ操作を呼び出し、モジュールパスをInprocServer32またはInprocHandler32ではなくLocalServer32に登録します。

10
Roman R.