首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法通过适用于Java -8、64位及更高版本的NSIS安装程序检查Win-10中已安装的JAVA版本

无法通过适用于Java -8、64位及更高版本的NSIS安装程序检查Win-10中已安装的JAVA版本
EN

Stack Overflow用户
提问于 2018-08-07 14:02:30
回答 2查看 534关注 0票数 1

该安装程序在Win-7、Win-8上运行良好,但在Win-10上运行得很奇怪。我的Java版本检查函数是-

代码语言:javascript
复制
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版本,甚至在提升模式下也无法识别。

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

有关更详细的结果,请参阅附件。

为了更清楚起见,可以参考这个开放问题NSIS installer issue

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-08 05:44:37

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

它可能看起来像这样:

代码语言:javascript
复制
${If} ${RunningX64}
  SetRegView 64
  ${registry::Read} ... $0 $1
  ...
${EndIf}
SetRegView 32
${If} $0 == "" 
  ${registry::Read} ... $0 $1
  ...
${EndIf}

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

票数 0
EN

Stack Overflow用户

发布于 2021-05-03 19:54:28

我通过使用以下命令解决了这个问题:

代码语言:javascript
复制
SetRegView 64

所以用于检查函数如下所示:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51719808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档