【问题标题】:When installing JRE using INNO setup Installer, The existing JRE is getting uninstalled. I don't want to uninstall使用 INNO setup Installer 安装 JRE 时,现有的 JRE 将被卸载。我不想卸载
【发布时间】:2018-01-17 12:15:02
【问题描述】:

说明: 我想使用 innosetup 安装 JRE,假设在 windows 系统中已经安装了 JRE 1.8 版本,从 innosetup 跳过 JRE 安装。

问题

  1. 当已经在系统中安装了 JRE,然后从 innosetup 卸载 JRE。在这里,我不想从 innosetup 中卸载 JRE。跳过 JRE 的安装。

  2. 我有下面的代码,我不知道哪里有错误,请帮助我。

[文件] 来源:“C:\Users\hyva\Desktop\HIaccounts\Dependies\jre-8u131-windows-i586.exe”;目标目录:“{tmp}”;目标名称:“JREInstaller.exe”;标志:安装后删除; AfterInstall: RunJavaInstaller();检查: (NOT IsWin64) AND InstallJava(); 来源:“C:\Users\hyva\Desktop\HIaccounts\Dependies\jre-8u131-windows-x64.exe”;目标目录:“{tmp}”;目标名称:“JREInstaller.exe”;标志:安装后删除; AfterInstall: RunJavaInstaller();检查: IsWin64 AND 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;



        procedure RunJavaInstaller();
        var
          StatusText: string;
          ResultCode: Integer;
          Path, Parameters: string;
        begin
          Path := '{tmp}\JREInstaller.exe';
          { http://docs.oracle.com/javase/8/docs/technotes/guides/install/config.html#table_config_file_options }
          Parameters := '/s INSTALL_SILENT=Enable REBOOT=Disable SPONSORS=Disable REMOVEOUTOFDATEJRES=0';
          StatusText:= WizardForm.StatusLabel.Caption;
          WizardForm.StatusLabel.Caption:='Installing the java runtime environment. Wait a moment ...';
          WizardForm.ProgressGauge.Style := npbstMarquee;
          try
            if not Exec(ExpandConstant(Path), Parameters, '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
            begin
              { we inform the user we couldn't install the JRE }
              MsgBox('Java runtime environment install failed with error ' + IntToStr(ResultCode) + 
                '. Try installing it manually and try again to install MyProg.', mbError, MB_OK);
            end;
          finally
            WizardForm.StatusLabel.Caption := StatusText;
            WizardForm.ProgressGauge.Style := npbstNormal;
          end;
        end;

【问题讨论】:

    标签: java inno-setup


    【解决方案1】:

    您可能需要两种不同版本的InstallJava 函数——一种检查HKLM32 并用于not IsWin64,另一种检查HKLM64 并用于IsWin64

    (假设 Java 安装程序仅根据您运行的安装程序更新 32 位或 64 位注册表,并且不会同时更新两者。我尚未对此进行验证。)

    【讨论】:

    • 感谢您的精彩建议。它运行良好,但我需要在所有 Windows 7、8 和 10 以及 32 位和 64 位机器上进行测试。
    • 如果您想在多个操作系统上进行测试,请使用 VM。但是,您仍然需要能够安装这些操作系统。
    • 这是正确的选择。
    【解决方案2】:

    这是基于@Miral's answer的工作代码。

    [Files]
    Source: "C:\Users\user\Desktop\Dependies\jre-8u131-windows-i586.exe"; \
        DestDir: "{tmp}"; DestName: "JREInstaller.exe"; Flags: deleteafterinstall; \
        AfterInstall: RunJavaInstaller(); Check: (NOT IsWin64) AND InstallJava();
    Source: "C:\Users\user\Desktop\Dependies\jre-8u131-windows-x64.exe"; \
        DestDir: "{tmp}"; DestName: "JREInstaller.exe"; Flags: deleteafterinstall; \
        AfterInstall: RunJavaInstaller(); Check: IsWin64 AND InstallJava64();
    
    [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 DoInstallJava(RootKey: Integer) : Boolean;
    var
      JVer: String;
    begin
      RegQueryStringValue(
        RootKey, 'SOFTWARE\JavaSoft\Java Runtime Environment', 'CurrentVersion', JVer);
      Result := (Length( JVer ) = 0) or (CompareVersion(JVer, '1.8') < 0);
    end;
    
    function InstallJava() : Boolean;
    begin
      Result := DoInstallJava(HKLM);
    end;
    
    function InstallJava64() : Boolean;
    begin
      Result := DoInstallJava(HKLM64);
    end;
    
    procedure RunJavaInstaller();
    var
      StatusText: string;
      ResultCode: Integer;
      Path, Parameters: string;
    begin
      Path := '{tmp}\JREInstaller.exe';
      { http://docs.oracle.com/javase/8/docs/technotes/guides/install/config.html#table_config_file_options }
      Parameters := '/s INSTALL_SILENT=Enable REBOOT=Disable SPONSORS=Disable REMOVEOUTOFDATEJRES=1';
      StatusText:= WizardForm.StatusLabel.Caption;
      WizardForm.StatusLabel.Caption:='Installing the java runtime environment. Wait a moment ...';
      WizardForm.ProgressGauge.Style := npbstMarquee;
      try
        if not Exec(ExpandConstant(Path), Parameters, '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
        begin
          { we inform the user we couldn't install the JRE }
          MsgBox('Java runtime environment install failed with error ' + IntToStr(ResultCode) + 
            '. Try installing it manually and try again to install MyProg.', mbError, MB_OK);
        end;
      finally
        WizardForm.StatusLabel.Caption := StatusText;
        WizardForm.ProgressGauge.Style := npbstNormal;
      end;
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 2018-05-04
      • 1970-01-01
      • 2019-11-05
      • 2013-03-28
      • 2015-08-31
      • 2017-08-15
      相关资源
      最近更新 更多