3

COM サーバーを登録するには、昇格モードで次のように実行します。

regsvr32.exe com.dll

ユーザーごとの登録を実行するには、ユーザー アカウントで実行します。

regsvr32.exe /n /i:user com.dll

regsvr32.exe は次のパラメーターをサポートします。

/u - Unregister server 
/i - Call DllInstall passing it an optional [cmdline]; when used with /u calls dll uninstall 
/n - do not call DllRegisterServer; this option must be used with /i 
/s – Silent; display no message boxes (added with Windows XP and Windows Vista)

Delphi で COM サーバーを作成すると、次のメソッドがエクスポートされました。

exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer,
  DllInstall;

これらが起こることに気づきました:

  1. 「regsvr32.exe com.dll」は DllRegisterServer を呼び出します。
  2. 「regsvr32.exe /u com.dll」は DllUnregisterServer を呼び出します。
  3. "regsvr32.exe /n /i:user com.dll" は DllInstall を呼び出します。
  4. "regsvr32.exe /u /n /i:user com.dll" は DllInstall を呼び出します。

パラメータ /n と /i、および DllUnregisterServer と DllInstall と混同しています。違いはありますか?

また、「/u /n /i:user」が Dllinstall を呼び出すのはなぜですか? 「HKEY_CURRENT_USER\Software\Classes」の対応するレジストリ エントリが削除されていることに気付きました。

4

2 に答える 2

7

DllInstall() のドキュメントで違いが説明されています。

DllInstall は、アプリケーションのインストールとセットアップにのみ使用されます。アプリケーションから呼び出すべきではありません。目的は DllRegisterServer または DllUnregisterServer と似ています。これらの関数とは異なり、DllInstall はさまざまなアクションを指定するために使用できる入力文字列を受け取ります。これにより、適切な基準に基づいて、複数の方法で DLL をインストールできます。

regsvr32 で DllInstall を使用するには、「/i」フラグの後にコロン (:) と文字列を追加します。文字列は、pszCmdLine パラメータとして DllInstall に渡されます。コロンと文字列を省略すると、pszCmdLine は NULL に設定されます。次の例は、DLL をインストールするために使用されます。

regsvr32 /i:"Install_1" dllname.dll

DllInstall は、bInstall を TRUE に設定し、pszCmdLine を「Install_1」に設定して呼び出されます。DLL をアンインストールするには、次のコマンドを使用します。

regsvr32 /u /i:"Install_1" dllname.dll

上記の両方の例では、DllRegisterServer または DllUnregisterServer も呼び出されます。DllInstall のみを呼び出すには、"/n" フラグを追加します。

regsvr32 /n /i:"Install_1" dllname.dll

于 2012-06-12T04:48:46.723 に答える
2

私のアドバイスは、zippy32.exeの使用をまったくスキップすることです。これは、自分で作業を行うのと同じくらい簡単です。

int register(char const *DllName) { 
        HMODULE library = LoadLibrary(DllName); 
        if (NULL == library) { 
                // unable to load DLL 
                // use GetLastError() to find out why. 
                return -1;      // or a value based on GetLastError() 
        } 
        STDAPI (*DllRegisterServer)(void); 
        DllRegisterServer = GetProcAddress(library, "DllRegisterServer"); 
        if (NULL == DllRegisterServer) { 
                // DLL probably isn't a control -- it doesn't contain a 
                // DllRegisterServer function. At this point, you might 
                // want to look for a DllInstall function instead. This is 
                //  what RegSvr32 calls when invoked with '/i' 
                return -2; 
        } 
        int error; 
        if (NOERROR == (error=DllRegisterServer())) { 
                // It thinks it registered successfully. 
                return 0; 
        } 
        else 
                return error; 
} 

この特定のコードはを呼び出しますが、必要に応じて、、などDllRegisterServerを呼び出すようにパラメーター化するのは簡単です。これにより、何がいつ呼び出されるかなどに関する質問が削除されます。DllInstallDllUninstall

于 2012-06-12T03:44:06.990 に答える