2016-10-21 6 views
1

Inno SetupでJavaアプリケーションをインストールする際に、Java 7以上がインストールされているかどうかを確認し、必要に応じてインストールします。しかし、明らかに、私の現在のコードは、私のクライアントのコンピュータのJava 8を検出できません。私はバグを再現できませんでした。あなたは私が行方不明になる可能性のあるものを見ますか?最近のWindowsではこのコードが動作しないのでしょうか?Inno Setup Javaバージョンを検出

基本的には、レジストリでJava> = 1.7をチェックするだけです。

[Code] 

function InitializeSetup(): Boolean; 
var 
ErrorCode: Integer; 
JavaInstalled : Boolean; 
ResultMsg : Boolean; 
Versions: TArrayOfString; 
I: Integer; 
regRoot: Integer; 
begin 
{ Check which view of registry should be taken: } 
regRoot := HKLM 
begin 
    if IsWin64 then 
    begin 
    regRoot := HKLM64 
    end; 
end; 
if (RegGetSubkeyNames(regRoot, 'SOFTWARE\JavaSoft\Java Runtime Environment', Versions)) or (RegGetSubkeyNames(regRoot, 'SOFTWARE\JavaSoft\Java Development Kit', Versions)) then 
begin 
    for I := 0 to GetArrayLength(Versions)-1 do 
    if JavaInstalled = true then 
    begin 
    //do nothing 
    end else 
    begin 
    if (Versions[I][2]='.') and ((StrToInt(Versions[I][1]) > 1) or ((StrToInt(Versions[I][1]) = 1) and (StrToInt(Versions[I][3]) >= 7))) then 
    begin 
    JavaInstalled := true; 
    end else 
    begin 
    JavaInstalled := false; 
    end; 
    end; 
end else 
begin 
    JavaInstalled := false; 
end; 

if JavaInstalled then 
begin 
    Result := true; 
end else 
begin 
    ResultMsg := MsgBox(ExpandConstant('{cm:JavaRequired}'), mbConfirmation, MB_YESNO) = idYes; 
    if ResultMsg = false then 
    begin 
    Result := false; 
    end else 
    begin 
    Result := true; 
    ShellExec('open', 'http://www.java.com/getjava/', '','',SW_SHOWNORMAL,ewNoWait,ErrorCode); 
    end; 
end; 
end; 

編集:これはマーティンの回答に基づいて最終的な結果です。

[Code] 
function CutJavaVersionPart(var V: string): Integer; 
var 
    S: string; 
    P: Integer; 
begin 
    if Length(V) = 0 then 
    begin 
    Result := 0; 
    end 
    else 
    begin 
    P := Pos('.', V); 
    if P = 0 then P := Pos('_', V); 

    if P > 0 then 
    begin 
     S := Copy(V, 1, P - 1); 
     Delete(V, 1, P); 
    end 
     else 
    begin 
     S := V; 
     V := ''; 
    end; 
    Result := StrToIntDef(S, 0); 
    end; 
end; 

function MaxJavaVersion(V1, V2: string): string; 
var 
    Part1, Part2: Integer; 
    Buf1, Buf2: string; 
begin 
    Buf1 := V1; 
    Buf2 := V2; 
    Result := ''; 
    while (Result = '') and 
     ((Buf1 <> '') or (Buf2 <> '')) do 
    begin 
    Part1 := CutJavaVersionPart(Buf1); 
    Part2 := CutJavaVersionPart(Buf2); 
    if Part1 > Part2 then Result := V1 
     else 
    if Part2 > Part1 then Result := V2; 
    end; 
end; 

function GetJavaVersion(): string; 
var 
    TempFile: string; 
    ResultCode: Integer; 
    S: AnsiString; 
    P: Integer; 
begin 
    TempFile := ExpandConstant('{tmp}\javaversion.txt'); 
    if (not ExecAsOriginalUser(
      ExpandConstant('{cmd}'), '/c java -version 2> "' + TempFile + '"', '', 
      SW_HIDE, ewWaitUntilTerminated, ResultCode)) or 
    (ResultCode <> 0) then 
    begin 
    Log('Failed to execute java -version'); 
    end 
    else 
    if not LoadStringFromFile(TempFile, S) then 
    begin 
    Log(Format('Error reading file %s', [TempFile])); 
    end 
    else 
    if Copy(S, 1, 14) <> 'java version "' then 
    begin 
    Log('Output of the java -version not as expected'); 
    end 
    else 
    begin 
    Delete(S, 1, 14); 
    P := Pos('"', S); 
    if P = 0 then 
    begin 
     Log('Output of the java -version not as expected'); 
    end 
     else 
    begin 
     SetLength(S, P - 1); 
     Result := S; 
    end; 
    end; 

    DeleteFile(TempFile); 
end; 

function HasJava1Dot7OrNewer: Boolean; 
begin 
    Result := (MaxJavaVersion('1.6.9', GetJavaVersion) <> '1.6.9'); 
end; 

function InitializeSetup(): Boolean; 
var 
    ErrorCode: Integer; 
begin 
    Result := HasJava1Dot7OrNewer; 
    if not Result then 
    begin 
    Result := MsgBox(ExpandConstant('{cm:JavaRequired}'), mbConfirmation, MB_YESNO) = idYes; 
    if Result then 
    begin 
     ShellExec(
     'open', 'https://www.java.com/getjava/', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode); 
    end; 
    end; 
end; 

答えて

2

私はHKLM\SoftwareJavaSoftキーを持っていません。私はHKLM\SOFTWARE\WOW6432Nodeにそれを持っています。 Inno Setupで実際にHKLM\SOFTWAREとは何ですか(32ビットアプリケーション)。

if IsWin64 then regRoot := HKLM64ブロックを削除して機能させる必要があるようです。または、両方のオプションを試してください。特定のニーズのために

function CutJavaVersionPart(var V: string): Integer; 
var 
    S: string; 
    P: Integer; 
begin 
    if Length(V) = 0 then 
    begin 
    Result := 0; 
    end 
    else 
    begin 
    P := Pos('.', V); 
    if P = 0 then P := Pos('_', V); 

    if P > 0 then 
    begin 
     S := Copy(V, 1, P - 1); 
     Delete(V, 1, P); 
    end 
     else 
    begin 
     S := V; 
     V := ''; 
    end; 
    Result := StrToIntDef(S, 0); 
    end; 
end; 

function MaxJavaVersion(V1, V2: string): string; 
var 
    Part1, Part2: Integer; 
    Buf1, Buf2: string; 
begin 
    Buf1 := V1; 
    Buf2 := V2; 
    Result := ''; 
    while (Result = '') and 
     ((Buf1 <> '') or (Buf2 <> '')) do 
    begin 
    Part1 := CutJavaVersionPart(Buf1); 
    Part2 := CutJavaVersionPart(Buf2); 
    if Part1 > Part2 then Result := V1 
     else 
    if Part2 > Part1 then Result := V2; 
    end; 
end; 

function GetJavaVersionFromSubKey(RootKey: Integer; SubKeyName: string): string; 
var 
    Versions: TArrayOfString; 
    I: Integer; 
begin 
    if RegGetSubkeyNames(RootKey, SubKeyName, Versions) then 
    begin 
    for I := 0 to GetArrayLength(Versions) - 1 do 
    begin 
     Result := MaxJavaVersion(Result, Versions[I]); 
    end; 
    end; 
end; 

function GetJavaVersionFromRootKey(RootKey: Integer): string; 
begin 
    Result := 
    MaxJavaVersion(
     GetJavaVersionFromSubKey(RootKey, 'SOFTWARE\JavaSoft\Java Runtime Environment'), 
     GetJavaVersionFromSubKey(RootKey, 'SOFTWARE\JavaSoft\Java Development Kit')); 
end; 

function GetJavaVersion: string; 
begin 
    Result := GetJavaVersionFromRootKey(HKLM); 
    if IsWin64 then 
    begin 
    Result := MaxJavaVersion(Result, GetJavaVersionFromRootKey(HKLM64)); 
    end; 
end; 

のJava 1.7以降が次のようにインストールされている場合、あなたは、チェックすることができます。


それとも、代わりにjava -versionを実行することを検討しましたか? InitializeSetup

function GetJavaVersion2: string; 
var 
    TempFile: string; 
    ResultCode: Integer; 
    S: AnsiString; 
    P: Integer; 
begin 
    TempFile := ExpandConstant('{tmp}\javaversion.txt'); 
    if (not ExecAsOriginalUser(
      ExpandConstant('{cmd}'), '/c java -version 2> "' + TempFile + '"', '', 
      SW_HIDE, ewWaitUntilTerminated, ResultCode)) or 
    (ResultCode <> 0) then 
    begin 
    Log('Failed to execute java -version'); 
    end 
    else 
    if not LoadStringFromFile(TempFile, S) then 
    begin 
    Log(Format('Error reading file %s', [TempFile])); 
    end 
    else 
    if Copy(S, 1, 14) <> 'java version "' then 
    begin 
    Log('Output of the java -version not as expected'); 
    end 
    else 
    begin 
    Delete(S, 1, 14); 
    P := Pos('"', S); 
    if P = 0 then 
    begin 
     Log('Output of the java -version not as expected'); 
    end 
     else 
    begin 
     SetLength(S, P - 1); 
     Result := S; 
    end; 
    end; 

    DeleteFile(TempFile); 
end; 

ビットより効率的な実装:

function InitializeSetup(): Boolean; 
var 
    ErrorCode: Integer; 
begin 
    Result := HasJava1Dot7OrNewer; 
    if not Result then 
    begin 
    Result := MsgBox(ExpandConstant('{cm:JavaRequired}'), mbConfirmation, MB_YESNO) = idYes; 
    if Result then 
    begin 
     ShellExec(
     'open', 'https://www.java.com/getjava/', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode); 
    end; 
    end; 
end; 
+0

あなたの非常に詳細な回答をありがとうたくさん!私の編集をチェックして、あなたの答えを正しく理解したかどうかを教えてください。さらに、私はJava 1.7以上が必要です。あなたの 'hasJavaXXXOrNewer'関数に'(MaxJavaVersion( '1.7.0'、GetJavaVersion)<> '1.7.0') 'を書くべきではありませんか?再度、感謝します ! – Sharcoux

+0

1)コードをコンパイルできません。あなたは 'GetJavaVersion2'ではなく' GetJavaVersion'を持っていますが、あなたは 'HasJava1Dot7OrNewer'から' GetJavaVersion'を呼び出します+ 'HasJava1Dot7OrNewer'を' InitializeSetup'でその使用以下に定義します。上に定義する必要があります(またはそれを宣言してください)。 2) '(MaxJavaVersion( '1.7.0'、GetJavaVersion)<> '1.7.0')'が正しくありません。 1.7よりも新しいバージョンがインストールされている場合に限り、それは当てはまります。しかし、 '1.7'に '1.8'のようなキーがあるとします。 '1.7.0_xxx'は、とにかく' 1.7.0_xxx'が '1.7'よりも新しいとみなされるので動作します。 –

+0

私は 'InitializeSetup' + Use' https:// 'をより効率的に実装しました! –

関連する問題