5

以下のスクリプトを使用して Java プログラムをインストールしています。このスクリプトで 2 つの問題に直面しています。これらの問題の修正方法をご存知でしたら教えてください。お時間をいただき、本当にありがとうございます

  1. JRE チェックは、インストールの開始とインストールの終了の 2 回行われています。インストールの開始時にのみJREチェックを実行したかった

  2. 以下の Windows レジストリ キーをチェックして JRE をチェックしていますが、このスクリプトはすべてのケースで機能していません。つまり、64 ビット JRE のインストールでは、これが機能することもあれば、失敗することもあります。すべてのシナリオ (つまり、32 ビット、64 ビット、およびすべての Windows バージョン) でレジストリをチェックするロジックを探しています。

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Test"
#define MyAppVersion "1.0"
#define MyAppPublisher "Test"
#define MyAppURL "gmail.com"
#define MyAppExeName "abc.exe"
#define MinJRE "1.6"


[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
;(To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{200DC169-9647-4295-91B4-B1D1D8482B82}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={userdocs}\xsxsxs\bvb
DisableDirPage=yes
DefaultGroupName=test
DisableProgramGroupPage=yes
AllowNoIcons=yes
LicenseFile=C:\test\Installers_PC_MAC\CORRECTIONS_TO_INSTALLER_BUGS\TemsOfUse.txt
OutputDir=C:\test\test
OutputBaseFilename=test
SetupIconFile=C:\test\Installers_PC_MAC\CORRECTIONS_TO_INSTALLER_BUGS\Icon\icon.ico
Compression=lzma
SolidCompression=yes
PrivilegesRequired=lowest


[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1

[Dirs]
Name: "{app}\Graphics"
Name: "{app}\lib"
Name: "{app}\Database"
Name: "{app}\Grades"
Name: "{app}\HelpFiles"
Name: "{app}\images"
Name: "{app}\Scripts"

[Files]

Source: "C:\test\Installers_PC_MAC\CORRECTIONS_TO_INSTALLER_BUGS\test.exe"; DestDir: "{app}"; Flags: ignoreversion;
Source: "C:\test\Installers_PC_MAC\CORRECTIONS_TO_INSTALLER_BUGS\Graphics\*"; DestDir: "{app}\Graphics"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\test\Installers_PC_MAC\CORRECTIONS_TO_INSTALLER_BUGS\lib\*"; DestDir: "{app}\lib"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\test\Installers_PC_MAC\CORRECTIONS_TO_INSTALLER_BUGS\DataBase\*"; DestDir: "{app}\DataBase"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\test\Installers_PC_MAC\CORRECTIONS_TO_INSTALLER_BUGS\Grades\*"; DestDir: "{app}\Grades"; Flags: ignoreversion recursesubdirs createallsubdirs


[Icons]
Name: "{group}\test"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:uninstallProgram,test}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}";check:InitializeSetup; Flags: nowait postinstall skipifsilent


[Code]

function installJRE(): Boolean;
   var
   Result1 : Boolean;
   ErrorCode: Integer;
   begin
   Result1 := false;

   Result1 := MsgBox('Java is required to run the program you are trying to install. Please click on Yes button given below to close this installer and be directed to a website were you can download and install Java.',
   mbConfirmation, MB_YESNO) = idYes;
   if Result1 = false then
   begin
   // user can install the Java later also
   Result:=true;
   end else
   begin
   Result:=false;        
   ShellExec('open', 'http://www.oracle.com/technetwork/java/javase/downloads/jre6downloads-1902815.html','','',SW_SHOWNORMAL,ewNoWait,ErrorCode);
  end;
end;


function InitializeSetup(): Boolean;
var 
 jreVersion: String;                            
   begin
   Result := False; 
     if ((RegValueExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\JavaSoft\Java Runtime Environment','CurrentVersion'))) then
     begin      
      RegQueryStringValue(HKLM,'Software\JavaSoft\Java Runtime Environment','CurrentVersion',jreVersion);
      if CompareStr(jreVersion,'{#MinJRE}') > 0 then 
      begin      
          Result:=true;
       end else
       begin
        if(installJRE) then
         Result:=true;  
      end;      
       end else
        if(installJRE) then
        Result:=true;
       end;
    end.
4

2 に答える 2

6

InitializeSetup 関数が Check 関数として使用されている場合に複数回呼び出されるのはなぜですか?

InitializeSetupイベント メソッドを関数として使用してCheckいるため、このメソッドが複数回呼び出されます。セットアップが (リアル イベント メソッドとして) 最初に初期化されるときと、次にがセクションCheckからのファイル エントリを開くかどうかを決定するとき。[Run]

基本的に、Check関数にイベント メソッドを使用するのは間違っています。それらを手動で呼び出す必要はありません。単にインストーラー アプリケーションによって起動されるようにします。あなたの場合、JREがインストールされているかどうかを確認するだけの関数を作成し、そのような関数をCheck.

Java SE ランタイム環境のバージョンを取得するには?

セットアップを 64 ビットとして実行する必要はありません。WOW レジストリ ノードから読み取るだけで、64 ビット Windows 上の 64 ビット JRE のバージョンを取得できます。私はこのようなものを使用しようとします:

[Run]
Filename: "{app}\MyApp.exe"; Flags: nowait postinstall skipifsilent; Check: IsJREInstalled

[Code]
#define MinJRE "1.6"
#define WebJRE "http://www.oracle.com/technetwork/java/javase/downloads/jre6downloads-1902815.html"

function IsJREInstalled: Boolean;
var
  JREVersion: string;
begin
  // read JRE version
  Result := RegQueryStringValue(HKLM32, 'Software\JavaSoft\Java Runtime Environment',
    'CurrentVersion', JREVersion);
  // if the previous reading failed and we're on 64-bit Windows, try to read 
  // the JRE version from WOW node
  if not Result and IsWin64 then
    Result := RegQueryStringValue(HKLM64, 'Software\JavaSoft\Java Runtime Environment',
      'CurrentVersion', JREVersion);
  // if the JRE version was read, check if it's at least the minimum one
  if Result then
    Result := CompareStr(JREVersion, '{#MinJRE}') >= 0;
end;

function InitializeSetup: Boolean;
var
  ErrorCode: Integer;
begin
  Result := True;
  // check if JRE is installed; if not, then...
  if not IsJREInstalled then
  begin
    // show a message box and let user to choose if they want to download JRE;
    // if so, go to its download site and exit setup; continue otherwise
    if MsgBox('Java is required. Do you want to download it now ?',
      mbConfirmation, MB_YESNO) = IDYES then
    begin
      Result := False;
      ShellExec('', '{#WebJRE}', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
    end;
  end;
end;
于 2013-02-09T05:08:34.653 に答える
0

問題 1 については、check:InitializeSetup;から削除する必要があります[Run]InitializeSetupインストーラーの起動時に一度呼び出されます。

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

エクストラを追加するcheckと、関数がもう一度トリガーされますが、これは不要です。

問題 2 については、インストーラーが x86 として実行され、レジストリ キーの x64 セクションにアクセスする機会がないため、JRE x64 はまったく検出されません。x64 JRE を検証するには、設定する必要がありますArchitecturesInstallIn64BitMode

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

ビット数は、インストーラーの作成者にとって非常に複雑なトピックであるため、適切に操作する方法についてさらに調査する必要があります。

于 2013-02-09T02:57:39.783 に答える