【问题标题】:Not able to Check installed Java version in Win-10 through NSIS installer for JAVA -8 , 64-bit and above无法通过 JAVA -8、64 位及更高版本的 NSIS 安装程序检查 Win-10 中已安装的 Java 版本
【发布时间】:2019-01-14 03:10:29
【问题描述】:

安装程序在 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

在不同系统中运行此示例安装程序后,我发现安装了 Java 8(64 位)的 Win-10(64 位系统)无法识别 JAVA 版本,即使在提升模式下也无法识别.

对于安装了 JAVA 8(32 位)的 Win-10(64 位系统)HKLM\SOFTWARE\JavaSoft\Java Runtime Environment,此路径将注册表搜索重定向到 HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment,因此在这两种情况下(32 位和 64 位 Java 版本检查)即使在 Elevated 模式下也可以找到 Java 版本,其行为相同,

请查看附件结果以获得更详细的结果。

可以参考这个未解决的问题NSIS installer issue 以获得更清晰的信息。

【问题讨论】:

    标签: java windows registry installation nsis


    【解决方案1】:

    我通过以下方式解决了这个问题:

    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
    

    【讨论】:

      【解决方案2】:

      您的 64 位检测代码没有意义,NSIS 在 32 位安装程序中默认使用 32 位注册表视图。 WOW6432Nodereserved name,如果可能的话,你不应该真正使用它。提升安装程序不会改变注册表重定向的工作方式。

      它应该看起来像这样:

      ${If} ${RunningX64}
        SetRegView 64
        ${registry::Read} ... $0 $1
        ...
      ${EndIf}
      SetRegView 32
      ${If} $0 == "" 
        ${registry::Read} ... $0 $1
        ...
      ${EndIf}
      

      根据您链接到的页面,Java v9 更改了注册表路径和名称,因此您需要更新代码来处理这些内容。

      【讨论】:

      • 非常感谢,成功了。但我仍然想知道为什么 ${registry::Read} "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environmen" "JAVA_HOME" $0 $1 ,即使您所说的修复,此注册表搜索也不起作用。
      • “环境”而不是“环境”
      猜你喜欢
      • 1970-01-01
      • 2018-01-28
      • 2017-05-25
      • 1970-01-01
      • 2015-07-04
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多