java - 如何从 Inno Setup 安装 JRE?

标签 java permissions inno-setup permission-denied

我正在尝试通过 Inno Setup(以及另一个应用程序)安装适用于最新平台(x64 或 x86)的 Java 运行时环境。我找到了一些脚本示例,用于说明如何检测版本并安装(如果正确)并根据我的需要进行调整,但我一直遇到这个问题:

Unable to open file "path\to\JREInstall.exe":
CreateProcess failed: Code 5:
Access Is Denied

这是严格负责安装 JRE 的代码:

[Setup]
AppName="JRE Setup"
AppVersion=0.1
DefaultDirName="JRE Setup"

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Files]
Source: "jre-8u11-windows-x64.exe"; DestDir: "{tmp}\JREInstall.exe"; \
    Check: IsWin64 AND InstallJava();
Source: "jre-8u11-windows-i586.exe"; DestDir: "{tmp}\JREInstall.exe"; \
    Check: (NOT IsWin64) AND InstallJava();

[Run]
Filename: "{tmp}\JREInstall.exe"; Parameters: "/s"; \
    Flags: nowait postinstall runhidden runascurrentuser; Check: InstallJava()

[Code]

procedure DecodeVersion(verstr: String; var verint: array of Integer);
var
  i,p: Integer; s: string;
begin
  { initialize array }
  verint := [0,0,0,0];
  i := 0;
  while ((Length(verstr) > 0) and (i < 4)) do
  begin
    p := pos ('.', verstr);
    if p > 0 then
    begin
      if p = 1 then s:= '0' else s:= Copy (verstr, 1, p - 1);
      verint[i] := StrToInt(s);
      i := i + 1;
      verstr := Copy (verstr, p+1, Length(verstr));
    end
    else
    begin
      verint[i] := StrToInt (verstr);
      verstr := '';
    end;
  end;
end;

function CompareVersion (ver1, ver2: String) : Integer;
var
  verint1, verint2: array of Integer;
  i: integer;
begin
  SetArrayLength (verint1, 4);
  DecodeVersion (ver1, verint1);

  SetArrayLength (verint2, 4);
  DecodeVersion (ver2, verint2);

  Result := 0; i := 0;
  while ((Result = 0) and ( i < 4 )) do
  begin
    if verint1[i] > verint2[i] then
      Result := 1
    else
      if verint1[i] < verint2[i] then
        Result := -1
      else
        Result := 0;
    i := i + 1;
  end;
end;

function InstallJava() : Boolean;
var
  ErrCode: Integer;
  JVer: String;
  InstallJ: Boolean;
begin
  RegQueryStringValue(
    HKLM, 'SOFTWARE\JavaSoft\Java Runtime Environment', 'CurrentVersion', JVer);
  InstallJ := true;
  if Length( JVer ) > 0 then
  begin
    if CompareVersion(JVer, '1.8') >= 0 then
    begin
      InstallJ := false;
    end;
  end;
  Result := InstallJ;
end;

在完整的设置脚本中,相同的消息继续出现。 如何让 JRE 安装程序从此脚本化安装文件运行?

最佳答案

我能够找出问题所在: 显然我错误地使用了这些行:

Source: "jre-8u11-windows-x64.exe"; DestDir: "{tmp}\JREInstall.exe"; Check: IsWin64 AND InstallJava();
Source: "jre-8u11-windows-i586.exe"; DestDir: "{tmp}\JREInstall.exe"; Check: (NOT IsWin64) AND InstallJava();

它们应该像这样就位:

Source: "jre-8u11-windows-x64.exe"; DestDir: "{tmp}"; DestName: "JREInstall.exe"; Check: IsWin64 AND InstallJava();
Source: "jre-8u11-windows-i586.exe"; DestDir: "{tmp}"; DestName: "JREInstall.exe"; Check: (NOT IsWin64) AND InstallJava();

这似乎解决了问题。

还有这一行我弄错了:

Filename: "{tmp}\JREInstall.exe"; Parameters: "/s"; Flags: nowait postinstall runhidden runascurrentuser; Check: InstallJava()

应该是:

Filename: "{tmp}\JREInstall.exe"; Parameters: "/s"; Flags: nowait runhidden runascurrentuser; Check: InstallJava()

这是我在使用此特定工具方面的有限经验所能提出的最佳解决方案。有机会时,我会查看 PrepareToInstall 选项,但目前可以使用。

关于java - 如何从 Inno Setup 安装 JRE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24964393/

相关文章:

inno-setup - 如何从 Inno Setup 外部访问 Inno Setup 安装程序的路径?

java - 如何将 float 四舍五入到小数点后两位,合并当前月份和年份,并修复循环?

authentication - 我应该使用 Laravel 的 Authorization 还是 Zizaco 的 Entrust?

javascript - Chrome 扩展 : load different content scripts

inno-setup - 在 Inno Setup 安装程序中指定日志名称

installation - 创新设置: Load file edited during installation for wpInfoAfter

java - 计算 Java 中按字段分组的对象

java - 按钮 ClickListener 在 LibGDX 游戏中不起作用

java - 为什么 HttpServletRequest 会截断 # 字符上的 url 输入?

python - Django 组和权限