我一直在搜索许多相关的Q,例如this one,但一直在努力让我的第一个NSIS安装程序启动并运行。
安装程序特定于64位计算机(其他代码捕获此项,如果是32位则中止)。
我只需返回值0(未找到安装,1(找到v9)或2(找到v10)。
目前,如果我在所有三种情况下在一台机器上运行此NSIS,它总是返回0。
有人能指出我在代码逻辑中做错了吗?
我也可能没有以最优雅的方式做到这一点,所以真的很欣赏一个更好的方法片段,理想情况下有一些推理。
Var AGSv
Section "Check AGS" SEC01
call CheckAGS
Pop $R0
messagebox MB_OK $AGSv
SectionEnd
;Check to see if AGS is installed, and which version.
Function CheckAGS
;This is the key for v10
ReadRegStr $1 HKLM "SOFTWARE\Wow6432Node\ESRI\Server10.0\CoreRuntime" "RealVersion"
${If} $1 == ""
GoTo Try931
${Else}
StrCpy $AGSv 2
${EndIf}
;This is the key for v9
Try931:
ReadRegStr $2 HKLM "SOFTWARE\Wow6432Node\ESRI\ArcServer\Microsoft .NET Framework Edition" "RealVersion"
${If} $2 == ""
GoTo NoAGS
${Else}
StrCpy $AGSv 1
${EndIf}
NoAGS:
StrCpy $AGSv 0
Messagebox MB_OK "No AGS installation detected."
FunctionEnd
答案 0 :(得分:3)
问题在于函数中的goto逻辑,StrCpy $AGSv 0
行总是被执行(并且你永远不会推送任何内容,所以call CheckAGS
之后的pop会获得“随机”值)
Function CheckAGS
ReadRegStr $1 HKLM "SOFTWARE\Wow6432Node\ESRI\Server10.0\CoreRuntime" "RealVersion"
${If} $1 != ""
StrCpy $AGSv 2
return
{EndIf}
ReadRegStr $1 HKLM "SOFTWARE\Wow6432Node\ESRI\ArcServer\Microsoft .NET Framework Edition" "RealVersion"
${If} $1 != ""
StrCpy $AGSv 1
return
{EndIf}
StrCpy $AGSv 0 ;not found
Messagebox MB_ICONSTOP "No AGS installation detected."
FunctionEnd
你不应该直接使用Wow6432Node来读取64位注册表使用SetRegView ......