インストール中に、batファイルを実行します。 batファイルがエラーを返した場合、セットアップを中止/終了する必要があります。 MsgBox
を実行してユーザーに何が起こったかを伝え、中止をユーザーがキャンセルボタンを押したように見せて動作させたいのですが。
セットアップを中止/終了することは可能ですか?
コード例をいただければ幸いです。
[Run]
Filename: {tmp}\test.bat; WorkingDir: {tmp}; Flags: waituntilterminated runhidden
問題は、インストールプロセスが正常に完了した後に_[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;
_
ありがとう、ロバート。これは、セットアップを続行できないことをスクリプトが検出したときに発生する一般的な問題です。ただし、ソリューションに問題があります。 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;
他の可能性を締めくくるために:
ユーザーから情報を収集する前に前提条件を確認できる場合、確認を行うのに最適な場所はInitializeSetup
関数です。これにより、MsgBox
を表示してから、Result := False
で終了してインストールを中止できます。
最初にユーザーからいくつかの情報(インストールディレクトリなど)を収集する必要があるが、ファイルをインストールせずに状態を確認できる場合(ExtractTemporaryFile
を介したいくつかの情報を除く)、最適な場所はPrepareToInstall
関数。これにより、エラーメッセージを(返すことで)表示できます。その時点で、ユーザーは戻って何かを修正するか、インストールを自分で終了することができます。
チェックしている条件が特定のページ(ターゲットディレクトリなど)でのユーザーの選択に特に関連していて、ユーザーのシステムをまったく変更せずにすばやくチェックできる場合は、でそれを処理するのが最善です。 NextButtonClick
;エラーのあるMsgBox
を表示してから、False
を返すと、次のページに移動できなくなります。
他のすべてをインストールするまで待たなければならない場合は、インストールを終了するには遅すぎますが、とにかくそれを実行したい場合は、Robertの答えで十分です。
ここでの回答からいくつかのコードを使用して構成しました 完全なソリューション [実行]セクションでコマンドを安全に実行し、適切な通知とエラー時のロールバックを行います。