What is the different between /n and /i parameters of RegSvr32.exe?

落爺英雄遲暮 提交于 2019-12-01 06:24:09

问题


To register a COM server, we run something like in elevated mode:

regsvr32.exe com.dll

To perform per-user registration, execute in user account:

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

regsvr32.exe support these parameters:

/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)

When create a COM server in Delphi, these methods were exported:

exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer,
  DllInstall;

I notice these will happen:

  1. "regsvr32.exe com.dll" invoke DllRegisterServer.
  2. "regsvr32.exe /u com.dll" invoke DllUnregisterServer.
  3. "regsvr32.exe /n /i:user com.dll" invoke DllInstall.
  4. "regsvr32.exe /u /n /i:user com.dll" invoke DllInstall.

I am confuse with parameters /n and /i as well as DllUnregisterServer and DllInstall. Is there any different?

Also, why "/u /n /i:user" invoke Dllinstall? I notice the corresponding registry entry in "HKEY_CURRENT_USER\Software\Classes" was removed.


回答1:


The documentation for DllInstall() explains the difference:

DllInstall is used only for application installation and setup. It should not be called by an application. It is similar in purpose to DllRegisterServer or DllUnregisterServer. Unlike these functions, DllInstall takes an input string which can be used to specify a variety of different actions. This allows a DLL to be installed in more than one way, based on any criteria that is appropriate.

To use DllInstall with regsvr32, add a "/i" flag followed by a colon (:) and a string. The string will be passed to DllInstall as the pszCmdLine parameter. If you omit the colon and string, pszCmdLine will be set to NULL. The following example would be used to install a DLL.

regsvr32 /i:"Install_1" dllname.dll

DllInstall is invoked with bInstall set to TRUE and pszCmdLine set to "Install_1". To uninstall a DLL, use the following:

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

With both of the above examples, DllRegisterServer or DllUnregisterServer will also be called. To call DllInstall only, add a "/n" flag.

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




回答2:


My advice would be to just skip using regsvr32.exe at all -- it's about as easy to just do the job yourself:

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; 
} 

This particular code calls DllRegisterServer, but it's trivial to parameterize it to call DllInstall, DllUninstall, etc., as you wish. This removes any question about what gets called when, etc.



来源:https://stackoverflow.com/questions/10990216/what-is-the-different-between-n-and-i-parameters-of-regsvr32-exe

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!