Почему мой код NSIS не получает ключ реестра? - PullRequest
0 голосов
/ 10 января 2012

Я тралял множество связанных вопросов, таких как этот , но изо всех сил пытался запустить и запустить мой первый установщик 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 Ответ

3 голосов
/ 10 января 2012

Проблема в том, что вы используете логику 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 ...

...