Windows – the different between /n and /i parameters of RegSvr32.exe

comwinapiwindows

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.

Best Answer

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