在NSIS中阻止RegDll错误消息

时间:2016-03-07 20:01:10

标签: dll nsis

我正在安装一个安装程序并且在卸载时会出现问题,即Windows将引发错误(即使使用regsrv32 /u运行,所以基本上我想将/s标志添加到{{ 1}}在NSIS脚本中。

我还假设RegDll "$SYSDIR\foo32.dll"在64位系统上是$SysDir,在32位上是windows\syswow64?它是一个存在于系统路径中的32位驱动程序。

由于

1 个答案:

答案 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