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

17

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

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

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

[Run]
Filename: {tmp}\test.bat; WorkingDir: {tmp}; Flags: waituntilterminated runhidden
    
задан PM2 14.06.2011 в 17:17
источник
  • См. также Как заставить программу установки Inno выполнить сбой при выполнении команды «Запуск»? и использование кода выхода процесса для отображения сообщения об ошибке для определенного файла в [Run] –  Martin Prikryl 11.05.2017 в 15:12
  • Также см. Выход из установки Inno Setup из [code]. –  Martin Prikryl 12.07.2017 в 14:15

4 ответа

11

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

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

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

И вызовите {tmp}\test.bat , используя Exec или ExecAsOriginalUser , оба из них возвращают ResultCode. Затем вы можете попросить пользователя удалить.

Однако я думаю, что выполнение отмена будет проще.

Чтобы сделать это, создайте AfterInstall Event в последнем файле в вашем проекте. И запустите программу из этого события, так как вы можете отменить это событие.

Вот пример кода, который показывает, как это можно сделать.

[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;
    
ответ дан Robert Love 14.06.2011 в 20:10
источник
  • Спасибо. Это именно то, что я искал. –  PM2 14.06.2011 в 20:56
  • «WizardForm.Close» показывает диалог «да / нет», чтобы спросить пользователя, хочет ли он отменить, есть ли другой код, который заставляет выполнять отмену? –  Emad Elsaid 01.10.2013 в 13:05
26

Спасибо, Роберт. Это обычная проблема, возникающая в любое время, когда скрипт обнаруживает, что настройка не может быть продолжена. Однако в вашем решении есть проблема. 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;
    
ответ дан Mahris 12.10.2012 в 00:59
источник
  • Я искал это, поэтому спасибо за этот комментарий! –  BenDev 06.01.2017 в 09:33
2

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

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

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

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

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

    
ответ дан Miral 13.05.2017 в 04:22
источник
1

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

    
ответ дан Ivan Samygin 20.06.2014 в 10:49
источник