簡體   English   中英

使用INNO安裝程序安裝程序安裝JRE時,現有的JRE將被卸載。 我不想卸載

[英]When installing JRE using INNO setup Installer, The existing JRE is getting uninstalled. I don't want to uninstall

說明:我想使用innosetup安裝JRE,假設在Windows系統中已經安裝了JRE 1.8版本,請從innosetup跳過JRE安裝。

問題

  1. 當已經在系統中安裝JRE時,則可以從innosetup卸載JRE。 在這里,我不想從innosetup卸載JRE。 跳過JRE的安裝。

  2. 我有下面的代碼,我不是沒有確切的錯誤在那里,請幫助我。

[File]         
Source: "C:\Users\hyva\Desktop\HIaccounts\Dependies\jre-8u131-windows-i586.exe"; DestDir: "{tmp}"; DestName: "JREInstaller.exe";Flags: deleteafterinstall; AfterInstall: RunJavaInstaller(); Check: (NOT IsWin64) AND InstallJava();
 Source: "C:\Users\hyva\Desktop\HIaccounts\Dependies\jre-8u131-windows-x64.exe"; DestDir: "{tmp}"; DestName: "JREInstaller.exe"; Flags: deleteafterinstall; AfterInstall: RunJavaInstaller(); Check: 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;

您可能需要兩種不同版本的InstallJava函數-一種用於檢查HKLM32用於not IsWin64 ,另一種用於檢查HKLM64並用於IsWin64

(這假定Java安裝程序僅根據您運行的安裝程序來更新32位或64位注冊表,而不會同時更新兩者。我尚未對此進行驗證。)

這是基於@Miral的答案的工作代碼。

[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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM