2012-01-10 19 views
0

私はthis oneのような多くの関連するQをトロールしてきましたが、最初のNSISインストーラを起動して実行するのには苦労していました。NSISコードがレジストリキーを取得しないのはなぜですか?

インストーラは64ビットマシンに固有のものです(他のコードはこれを取り込み、32ビットの場合は中止します)。

私はちょうど(V10が見つかりました。)1(V9た)または2、(何も見つからインストール0の値を返さないする必要があります。

瞬間、私はすべての3つのシナリオでは、マシン上でこの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

問題は機能であなたのgotoのロジックで、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

素晴らしい作品、私に教訓を教えてくれました。私はSEの他の場所でも読んでいるので、SetRegViewを調べます。 ありがとう! – Simon

関連する問題