Подтвердить что ты не робот

Inno Setup: как прервать/завершить настройку во время установки?

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

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

Примеры кода были бы действительно оценены.

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

Ответ 1

Проблема заключается в том, что [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

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

Ответ 3

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

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

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

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

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

Ответ 4

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