web-dev-qa-db-ja.com

Inno Setup:インストール中にセットアップを中止/終了する方法は?

インストール中に、batファイルを実行します。 batファイルがエラーを返した場合、セットアップを中止/終了する必要があります。 MsgBoxを実行してユーザーに何が起こったかを伝え、中止をユーザーがキャンセルボタンを押したように見せて動作させたいのですが。

セットアップを中止/終了することは可能ですか?

コード例をいただければ幸いです。

[Run]
Filename: {tmp}\test.bat; WorkingDir: {tmp}; Flags: waituntilterminated runhidden
20
PM2

問題は、インストールプロセスが正常に完了した後に_[Run]_が発生することです。したがって、この時点でキャンセルすることはできません。アンインストールすることしかできません。また、_[Run]_では終了コードを取得できません。

したがって、いくつかのオプションがあります。

イベントの使用:procedure CurStepChanged(CurStep: TSetupStep);

そして、ExecまたはExecAsOriginalUserを使用して_{tmp}\test.bat_を呼び出すと、両方ともResultCodeが返されます。その後、ユーザーにアンインストールを促すことができます。

ただし、キャンセルの方が簡単だと思います。

これを行うには、プロジェクトの最後のファイルにAfterInstallイベントを作成します。そして、このイベントからキャンセルできるので、このイベントからプログラムを実行します。

これは、それがどのように行われるかを示すいくつかのサンプルコードです。

_[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"; AfterInstall: MyAfterInstall

[Code]
procedure MyAfterInstall();
var
 ResCode : Integer;
begin
 if Exec(ExpandConstant('{tmp}') + '\test.bat',
         '', SW_HIDE, ewWaitUntilTerminated, ResCode) then
 begin
   { Program Ran successfully ResCode now contains exit code results }

   { if Exit was 10 then Cancel Installation. }
   if ResCode = 10 then
   begin
      WizardForm.Close;
   end;       
 end
 else
 begin
   { Problem running Program }
   MsgBox('Error', SysErrorMessage(ResCode), mbError, MB_OK);
 end;

end;
_
12
Robert Love

ありがとう、ロバート。これは、セットアップを続行できないことをスクリプトが検出したときに発生する一般的な問題です。ただし、ソリューションに問題があります。 WizardForm.Closeはキャンセルダイアログを呼び出し、ユーザーが「はい」と答えた場合にのみインストールが停止されます。確実に終了するには、CancelButtonClickを呼び出す必要があります。

[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"; AfterInstall: MyAfterInstall

[Code]
var CancelWithoutPrompt: boolean;

function InitializeSetup(): Boolean;
begin
  CancelWithoutPrompt := false;
  result := true;
end;

procedure MyAfterInstall();
begin
  (Do something)
  if BadResult then begin
    MsgBox('Should cancel because...',mbError,MB_OK)
    CancelWithoutPrompt := true;
    WizardForm.Close;
  end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID=wpInstalling then
    Confirm := not CancelWithoutPrompt;
end;
30
Mahris

他の可能性を締めくくるために:

ユーザーから情報を収集する前に前提条件を確認できる場合、確認を行うのに最適な場所はInitializeSetup関数です。これにより、MsgBoxを表示してから、Result := Falseで終了してインストールを中止できます。

最初にユーザーからいくつかの情報(インストールディレクトリなど)を収集する必要があるが、ファイルをインストールせずに状態を確認できる場合(ExtractTemporaryFileを介したいくつかの情報を除く)、最適な場所はPrepareToInstall関数。これにより、エラーメッセージを(返すことで)表示できます。その時点で、ユーザーは戻って何かを修正するか、インストールを自分で終了することができます。

チェックしている条件が特定のページ(ターゲットディレクトリなど)でのユーザーの選択に特に関連していて、ユーザーのシステムをまったく変更せずにすばやくチェックできる場合は、でそれを処理するのが最善です。 NextButtonClick;エラーのあるMsgBoxを表示してから、Falseを返すと、次のページに移動できなくなります。

他のすべてをインストールするまで待たなければならない場合は、インストールを終了するには遅すぎますが、とにかくそれを実行したい場合は、Robertの答えで十分です。

3
Miral

ここでの回答からいくつかのコードを使用して構成しました 完全なソリューション [実行]セクションでコマンドを安全に実行し、適切な通知とエラー時のロールバックを行います。

1
Ivan Samygin