InnoSetup: определить, является ли Java 32-битной или 64-битной - PullRequest
3 голосов
/ 06 ноября 2011

В InnoSetup я запускаю этот код:

J32 := ShellExec('', 'java', '-d32 -version', '', SW_HIDE, ewWaitUntilTerminated, ec);
J64 := ShellExec('', 'java', '-d64 -version', '', SW_HIDE, ewWaitUntilTerminated, ec);

И J32, и J64 True.

В командной строке:

> java -d32 -version
Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.

> echo %errorlevel%
1

> java -d64 -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) 64-Bit Server VM (build 21.0-b17, mixed mode)

> echo %errorlevel%
0

Почему ShellExec() игнорирует Params?

Я пытался Exec() также:

// this way
J32 := Exec('java', '-d32 -version', '', SW_HIDE, ewWaitUntilTerminated, ec);
// and this way
J32 := Exec('>', 'java -d32 -version', '', SW_HIDE, ewWaitUntilTerminated, ec);

Они все возвращают True и ec = 1, несмотря на то, что яесть 64-битный Java.

Кажется, что Exec и ShellExec возвращают True, потому что они успешно запускают java, но они не отслеживают код ошибкиjava возвращается.

1 Ответ

1 голос
/ 07 августа 2014

Справка Inno Setup гласит:

http://www.jrsoftware.org/ishelp/index.php?topic=setup_architecturesinstallin64bitmode

Путь System32, возвращаемый константой {sys}, по умолчанию отображается в 64-битный системный каталог при использовании вразделы [Dirs], [Files], [InstallDelete], [Run], [UninstallDelete] и [UninstallRun].Это связано с тем, что программа установки / удаления временно отключает перенаправление файловой системы WOW64 [внешняя ссылка], когда к этим разделам обращаются к файлам / каталогам.В других местах System32 и {sys} отображаются в 32-битный системный каталог, как это обычно бывает в 32-битном процессе.

Так что в 64-битном режиме в разделе [Code] все32-битный.Он будет выполнять 32-разрядную версию Java, а c: \ Windows \ System32 указывает на папку WOW64, то есть на 32-разрядную версию System32.

Этот ответ показывает, как вместо этого проверить Java в реестре:

Нужна помощь по сценарию Inno Setup - проблема в проверке установки jre

После этого ответа, кажется, работает следующий код, чтобы проверить, установлена ​​ли 64-битная Java 1.7+:

[Code]

function JavaIsMissing(): Boolean;
var 
javaVersionOutput: AnsiString;

begin

result := not RegQueryStringValue(HKLM64, 'Software\JavaSoft\Java Runtime Environment',
   'CurrentVersion', javaVersionOutput);
if not result then
   result := CompareStr(javaVersionOutput, '1.7') < 0;
end;

[Run]
Filename: "{tmp}\{#JavaInstaller}"; StatusMsg: "Java Runtime Enviroment not installed on your system. Installing..."; Check: JavaIsMissing
...