问题
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:
- "regsvr32.exe com.dll" invoke DllRegisterServer.
- "regsvr32.exe /u com.dll" invoke DllUnregisterServer.
- "regsvr32.exe /n /i:user com.dll" invoke DllInstall.
- "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