Inno Setup: Как прервать / прекратить установку во время установки? - PullRequest
18 голосов
/ 14 июня 2011

Во время установки я запускаю bat-файл.Если файл bat возвращает ошибку, мне нужно прервать / прекратить установку.Я бы хотел, чтобы он MsgBox сообщал пользователю, что произошло, а затем прерывание должно было выглядеть и вести себя так, как будто пользователь нажал кнопку Отмена .

прервать / завершить настройку?

Примеры кода были бы очень полезны.

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

Ответы [ 4 ]

30 голосов
/ 12 октября 2012

Спасибо, Роберт.Это обычная проблема, возникающая в любое время, когда сценарий обнаруживает, что установка не может быть продолжена.Однако в вашем решении есть проблема.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;
12 голосов
/ 14 июня 2011

Проблема в том, что [Run] возникает после успешного завершения процесса установки. Таким образом, вы не можете отменить на этом этапе, вы можете только удалить. Также [Run] не позволяет получить код выхода.

Итак, у вас есть несколько вариантов.

Событие использования: procedure CurStepChanged(CurStep: TSetupStep);

И вызов {tmp}\test.bat с использованием Exec или ExecAsOriginalUser, оба возвращают 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;
2 голосов
/ 13 мая 2017

Просто чтобы закруглить другие возможности:

Если вы можете проверить предварительные условия перед сбором какой-либо информации от пользователя, тогда лучшее место для проверки - функция InitializeSetup. Это позволяет вам отобразить MsgBox и затем выйти с помощью Result := False, чтобы прервать установку.

Если вам нужно сначала получить некоторую информацию от пользователя (например, каталог установки), но вы все равно можете проверить состояние без установки каких-либо файлов (кроме, возможно, нескольких через ExtractTemporaryFile), тогда лучшее место - в PrepareToInstall функция. Это позволяет отображать сообщение об ошибке (возвращая его), после чего пользователь может либо вернуться назад и исправить что-либо, либо самостоятельно завершить установку.

Если проверяемое вами условие относится конкретно к выбору пользователя на определенной странице (опять же, например, к целевому каталогу), и вы можете выполнить проверку быстро и без каких-либо изменений в системе пользователя, тогда лучше справиться с этим в NextButtonClick; Вы можете отобразить MsgBox с ошибкой, а затем вернуть False, чтобы предотвратить переход на следующую страницу.

Если вам нужно подождать, пока после установки всего остального, то уже слишком поздно выйти из установки, но если вы все равно захотите это сделать, то ответа Роберта будет достаточно.

1 голос
/ 20 июня 2014

Я использовал некоторый код из ответов здесь, чтобы составить полное решение для безопасного выполнения команд в секции [Run] с надлежащим уведомлением и откатом при ошибке.

...