RegSvr32.exe的/ n和/ i参数之间有什么不同?

时间:2012-06-12 03:33:43

标签: windows winapi com

要注册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。
  5. 我对参数/ n和/ i以及DllUnregisterServer和DllInstall感到困惑。有什么不同吗?

    另外,为什么“/ u / n / i:user”会调用Dllinstall?我注意到“HKEY_CURRENT_USER \ Software \ Classes”中相应的注册表项已被删除。

2 个答案:

答案 0 :(得分:6)

The documentation for DllInstall()解释了不同之处:

  

DllInstall仅用于应用程序安装和设置。它   不应该由应用程序调用。它的目的是相似的   DllRegisterServer或DllUnregisterServer。与这些功能不同,   DllInstall接受一个输入字符串,可用于指定a   各种不同的行动。这允许安装DLL   不止一种方式,基于任何适当的标准。

     

要在regsvr32中使用DllInstall,请添加" / i"标志后面跟冒号   (:)和一个字符串。该字符串将作为传递给DllInstall   pszCmdLine参数。如果省略冒号和字符串,请输入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

答案 1 :(得分:2)

我的建议是完全跳过使用regsvr32.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等是微不足道的。这样可以删除有关在等等时调用的内容的任何问题。