【问题标题】:InnoSetup: Detect if Java is 32-bit or 64-bitInnoSetup:检测 Java 是 32 位还是 64 位
【发布时间】:2011-11-06 14:49:19
【问题描述】:

在 InnoSetup 中我运行以下代码:

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

J32J64 都是 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);

尽管我有一个 64 位 java,但它们都返回 Trueec = 1

ExecShellExec 似乎返回 True 因为它们成功运行 java,但它们不跟踪错误代码 java 返回。

【问题讨论】:

  • ShellExec 从不等待进程完成。但是,您的倒数第二个命令 (Exec('java', '-d32 -version' ...) 看起来不错。 ec 运行后是什么? J32 中有什么内容?
  • Pascal 脚本:ShellExec 文档说:“Wait 参数指定函数是立即返回还是等待启动的进程终止或空闲。”
  • ec = 1。调用成功时始终为 1。 J32 = True
  • @Gray:谢谢,我知道这个问题。但是,它询问是否从 Java 程序中检测 JVM 版本。

标签: java jvm inno-setup


【解决方案1】:

Inno Setup 帮助指出:

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

{sys} 常量返回的 System32 路径映射到 64 位 使用时默认系统目录在[Dirs]、[Files]、 [InstallDelete]、[Run]、[UninstallDelete] 和 [UninstallRun] 部分。这是因为安装程序/卸载暂时禁用了 WOW64 文件/目录位于时的文件系统重定向 [外部链接] 由这些部分访问。在其他地方,System32 和 {sys} 映射到 32位系统目录,在32位进程中是正常的。

因此,在 [代码] 部分的 64 位模式下,所有内容都是 32 位的。它将执行 32 位 Java 并且 c:\Windows\System32 指向 WOW64 文件夹,即 System32 的 32 位版本。

这个答案显示了如何在注册表中检查 Java:

Need help on Inno Setup script - issue in check the jre install

根据该答案,以下代码似乎可以检查是否安装了 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

【讨论】:

    【解决方案2】:

    我想要一些我可以在多个 Inno Setup 项目中使用的东西,所以我编写了一个 DLL 来检测 Java 详细信息(主目录等):

    https://github.com/Bill-Stewart/JavaInfo

    从这里下载:https://github.com/Bill-Stewart/JavaInfo/releases

    下载包含一个示例 Inno Setup .iss 脚本,演示如何使用 DLL 函数(包括如何检查是 32 位还是 64 位)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 2014-08-04
      相关资源
      最近更新 更多