簡體   English   中英

無法通過 JAVA -8 64 位及更高版本的 NSIS 安裝程序在 Win-10 中檢查已安裝的 Java 版本

[英]Not able to Check installed Java version in Win-10 through NSIS installer for JAVA -8 , 64-bit and above

安裝程序適用於 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 版本,這行為相同,

請查找附件結果以獲得更詳細的結果。 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM