2012-01-10 50 views
0

我一直在搜尋大量相關的問題,如this one,但一直在努力讓我的第一個NSIS安裝程序正常運行。爲什麼我的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 

回答

3

的問題是在功能的跳轉的邏輯,StrCpy $AGSv 0行總會被執行(你永遠也推過這麼call CheckAGS後彈出得到一個「隨機」值)

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

+0

工作很好,並且教會了我一個教訓。將查看SetRegView,因爲我還在SE上閱讀了其他地方。 謝謝! – Simon 2012-01-11 01:47:36