Чем отличаются параметры / n и / i файла RegSvr32.exe?

Чтобы зарегистрировать 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)

При создании COM-сервера в Delphi эти методы были экспортированы:

exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer,
  DllInstall;

Я заметил, что это произойдет:

"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.

Я путаю с параметрами / n и / i, а также с DllUnregisterServer и DllInstall. Есть ли что-то другое?

Кроме того, почему & quot; / u / n / i: user & quot; вызвать Dllinstall? Я заметил соответствующую запись в реестре в "HKEY_CURRENT_USER \ Software \ Classes" был удален.

 user16639012 июн. 2012 г., 05:42
/ н можноonly использоваться с / i, чтобы он не "между".
 Remy Lebeau12 июн. 2012 г., 06:50
Да, есть разница. DllRegisterServer () используется чаще всего, но DllInstall () более гибок, потому что вы можете отправлять ему параметры.
 Chau Chee Yang12 июн. 2012 г., 06:18
Или вкратце, когда использовать DllRegisterServer и когда использовать DllInstall? Есть ли что-то другое?
 Chau Chee Yang12 июн. 2012 г., 05:56
Любое другое, используя & quot; / n / i & quot; и без параметров (DllRegisterServer)? Когда использовать & quot; / n / i & quot; а когда не используются какие-либо параметры?
 user16639012 июн. 2012 г., 05:59
Итак, тогда "Когда использовать DllRegisterServer вместо (просто) DllInstall"?

Ответы на вопрос(2)

Решение Вопроса

Документация для DllInstall () объясняет разницу:

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

Я бы посоветовал просто пропустить использование 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, но это тривиально для параметризации вызоваDllInstall, DllUninstallи т. д., как вы хотите. Это устраняет любые вопросы о том, что вызывается, когда и т. Д.

 16 нояб. 2017 г., 14:35
Спасибо, это действительно полезно в моем случае.
 12 июн. 2012 г., 09:39
@DavidHeffernan: Вы, несомненно, правы - было бы лучше ответить на вопрос, который он задал, чем пытаться вместо этого фактически помочь ему. Я, наверное, просто должен быть навсегда изгнан за такую ужасную вещь.
 12 июн. 2012 г., 09:11
-1 не отвечает на заданный вопрос, на который можно ответить.
 Chau Chee Yang12 июн. 2012 г., 09:51
@JerryCoffin: Ваш ответ мне тоже очень помогает, но не прямой ответ на вопрос. Я учусь на твоем ответе тоже, регистрируя dll, используя технику программирования вместо использования командной строки.

Ваш ответ на вопрос