我正在安装一个安装程序并且在卸载时会出现问题,即Windows将引发错误(即使使用regsrv32 /u
运行,所以基本上我想将/s
标志添加到{{ 1}}在NSIS脚本中。
我还假设RegDll "$SYSDIR\foo32.dll"
在64位系统上是$SysDir
,在32位上是windows\syswow64
?它是一个存在于系统路径中的32位驱动程序。
由于
答案 0 :(得分:1)
我有点困惑,因为你在谈论RegDLL
和regsrv32.exe,它们是不同的东西! RegDLL
永远不能使用/ s开关,因为它调用的函数没有静默参数。
RegDLL和UnRegDLL是NSIS指令,内部分别为DllRegisterServer和DllUnregisterServer调用LoadLibrary
+ GetProcAddress
,从不使用regsrv32.exe。它们从不显示任何消息对话框,但是它们会在instfiles页面上的日志中打印一些文本,您可以使用SetDetailsPrint
来控制它。库中的注册功能可能会显示一个消息框,但NSIS无法做到这一点。
NSIS还附带了一个名为Library.nsh的头文件,它包含对事件注册方式的更高级控制,它可能会调用" $ SYSDIR \ regsvr32.exe"对于64位库,但它始终使用/ s开关。使用Library.nsh时,如果还要安装64位库,则必须设置正确的定义!
如果您总是只安装一个32位的库,它可能看起来像这样:
!include Library.nsh
Section Uninstall
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED "$InstDir\whatever.dll"
SectionEnd
如果你有32位和64位库,它可能看起来像这样:
!include Library.nsh
!include x64.nsh
Section Uninstall
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED "$InstDir\whatever-32.dll"
${If} ${RunningX64}
!define LIBRARY_X64
!insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED "$InstDir\whatever-64.dll"
!undef LIBRARY_X64
${EndIf}
SectionEnd