Установщик отлично работает для Win-7, Win-8, но странно работает для Win-10. Моя функция проверки версии Java -
Function checkJavaVersion
${If} ${RunningX64}
${registry::Read} "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environmen" "JAVA_HOME" $0 $1
MessageBox MB_OK "64 bit JAVA Home - $0"
MessageBox MB_OK "64 bit JAVA Home - $1"
${registry::Read} "HKLM\SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion" $0 $1
MessageBox MB_OK "64 bit JRE - $0"
MessageBox MB_OK "64 bit JRE - $1"
${If} $0 == ""
${registry::Read} "HKLM\SOFTWARE\JavaSoft\Java Development Kit" "CurrentVersion" $0 $1
MessageBox MB_OK "64 bit JDK - $0"
MessageBox MB_OK "64 bit JDK - $1"
${EndIf}
${registry::Read} "HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment" "CurrentVersion" $0 $1
MessageBox MB_OK "32 bit JRE - $0"
MessageBox MB_OK "32 bit JRE - $1"
${If} $0 == ""
${registry::Read} "HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Development Kit" "CurrentVersion" $0 $1
MessageBox MB_OK "32 bit JDK - $0"
MessageBox MB_OK "32 bit JDK - $1"
${EndIf}
${Else}
${registry::Read} "HKLM\SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion" $0 $1
MessageBox MB_OK "32 bit JRE - $0"
MessageBox MB_OK "32 bit JRE - $1"
${EndIf}
FunctionEnd
после запуска этого примера установщика в разных системах я обнаружил, что для Win-10 (64-разрядная система) с установленной Java 8 (64-разрядной) он не может распознать версию JAVA, даже в повышенном режиме.
Также для Win-10 (64-разрядная система) с установленным JAVA 8 (32-разрядная версия) HKLM\SOFTWARE\JavaSoft\Java Runtime Environment этот путь перенаправляет поиск в реестре на HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment, поэтому в обоих случаях (проверка 32-разрядной и 64-разрядной версии Java) версия Java обнаруживается даже в Повышенных режим ведет себя так же,
Пожалуйста, найдите прилагаемый результат для более подробного результата.

К этому открытому вопросу Проблема с установщиком NSIS можно обратиться для большей ясности.




Ваш 64-битный код обнаружения не имеет смысла, NSIS по умолчанию использует 32-битный вид реестра в 32-битных установщиках. WOW6432Node - это зарезервированное имя, и вам не следует его использовать, если это возможно. Повышение уровня установщика не меняет принцип работы перенаправления реестра.
Вероятно, это должно выглядеть примерно так:
${If} ${RunningX64}
SetRegView 64
${registry::Read} ... $0 $1
...
${EndIf}
SetRegView 32
${If} $0 == ""
${registry::Read} ... $0 $1
...
${EndIf}
Согласно странице, на которую вы ссылаетесь, Java v9 изменила путь и имена в реестре, поэтому вам необходимо обновить свой код для их обработки.
«Окружающая среда», а не «Окружающая среда»
Я решил эту проблему, используя:
SetRegView 64
Итак, функция, которая используется для проверки, выглядит так:
Function LocateJVM
;Check for Java version and location
Push $0
Push $1
ReadRegStr $JAVA_VER HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" CurrentVersion
StrCmp "" "$JAVA_VER" Check64Bit CheckJavaVer
Check64Bit:
SetRegView 64
ReadRegStr $JAVA_VER HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" CurrentVersion
StrCmp "" "$JAVA_VER" JavaNotPresent CheckJavaVer
JavaNotPresent:
StrCpy $JAVA_INSTALLATION_MSG "Java Runtime Environment nije instalirana na Vašem računaru. Da bi ste pokrenuli ovaj program potrebno je da instalirate Java 1.7 ili noviju."
Pop $1
Pop $0
;MessageBox MB_OK "Molim instalirajte Javu 1.7 ili noviju."
CheckJavaVer:
ReadRegStr $0 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment\$JAVA_VER" JavaHome
GetFullPathName /SHORT $JAVA_HOME "$0"
StrCpy $0 $JAVA_VER 1 0
StrCpy $1 $JAVA_VER 1 2
StrCpy $JAVA_VER "$0$1"
IntCmp 17 $JAVA_VER FoundCorrectJavaVer FoundCorrectJavaVer JavaVerNotCorrect
FoundCorrectJavaVer:
IfFileExists "$JAVA_HOME\bin\javaw.exe" 0 JavaNotPresent
;MessageBox MB_OK "Found Java: $JAVA_VER at $JAVA_HOME"
Goto Done
JavaVerNotCorrect:
;MessageBox MB_OK "Molim instalirajte Javu 1.7 ili noviju."
StrCpy $JAVA_INSTALLATION_MSG "Verzija Java Runtime Environment instalirana na Vašem računaru je $JAVA_VER. Da bi ste pokrenuli ovaj program potrebno je da instalirate Java 1.7 ili noviju."
Done:
Pop $1
Pop $0
FunctionEnd
большое спасибо, это сработало. Но я все еще хочу знать, почему $ {registry :: Read} "HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environmen" "JAVA_HOME" $ 0 $ 1, этот поиск в реестре не работает даже с указанным вами исправлением.