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;
あなたの非常に詳細な回答をありがとうたくさん!私の編集をチェックして、あなたの答えを正しく理解したかどうかを教えてください。さらに、私はJava 1.7以上が必要です。あなたの 'hasJavaXXXOrNewer'関数に'(MaxJavaVersion( '1.7.0'、GetJavaVersion)<> '1.7.0') 'を書くべきではありませんか?再度、感謝します ! – Sharcoux
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'よりも新しいとみなされるので動作します。 –
私は 'InitializeSetup' + Use' https:// 'をより効率的に実装しました! –