为什么我的NSIS代码没有获取注册表项?

时间:2012-01-10 11:08:31

标签: registry nsis

我一直在搜索许多相关的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

1 个答案:

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