3

我正在使用 NSIS 为我在 Visual C++ 2012 Express 中执行的项目制作可执行文件。因为我是初学者,所以我从 HM NIS Edit 中的设置向导开始。

我正在尝试将 Visual C++ 2012 Redistributable 与我的程序捆绑在一起,但是每次重新运行安装程序时,Redistributable 都会弹出一个“修复”和“删除”选项,这看起来很烦人。

所以我决定写一点 NSIS 脚本,到目前为止,这是脚本的开始:

Var STR
Section CheckForReg

ClearErrors
ReadRegDWORD $0 HKLM "SOFTWARE\Classes\Installer\Dependencies\{8e70e4e1-06d7-470b-9f74-a51bef21088e}" "Version"

ifErrors 0 Blank
StrCpy $STR "$INSTDIR\vcredist_x86.exe"
GoTo End

Blank:
    StrCpy $STR ""
End:

SectionEnd

这部分在脚本的最开始调用,全局变量 STR 应用于:

!define MUI_FINISHPAGE_RUN $STR

不久之后。

显然,这是一种非常愚蠢的方法,但我不需要太多。

问题是 CheckForReg 始终认为注册表不存在,并且不会移动到标签空白处。作为说明,我每次都手动检查注册表,注册表项如下所示:

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Dependencies\{8e70e4e1-06d7-470b-9f74-a51bef21088e}]
"Version"="11.0.51106.1"
"DisplayName"="Microsoft Visual C++ 2012 Redistributable (x86) - 11.0.51106"

所以问题是:我在哪里做错了?它看起来很简单,但显然我有一些倒退。

-- 删除了代码转储

4

1 回答 1

6

您只能使用 ReadRegDWORD 读取 DWORD!

!include LogicLib.nsh ; So we don't have to use all these labels
StrCpy $STR ""
ReadRegStr $0 HKLM "SOFTWARE\Classes\Installer\Dependencies\{8e70e4e1-06d7-470b-9f74-a51bef21088e}" "Version"
${If} $0 == ""
  StrCpy $STR "$INSTDIR\vcredist_x86.exe"
${EndIf}
于 2013-01-04T03:21:43.327 回答