Как принудительно перезагрузить систему после установки в Inno Setup - PullRequest
1 голос
/ 21 октября 2019

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

Я устанавливаю внешний драйверДрайвер в ssPostInstall.

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  begin
    if Exec(ExpandConstant('{app}\external.exe'), '-install', '', SW_SHOW,
            ewWaitUntilTerminated, ResultCode) then
    begin
      { handle success if necessary; ResultCode contains the exit code }
    end
    else begin
      { handle failure if necessary; ResultCode contains the error code }
      bReboot := true;
    end;
  end;

function NeedRestart(): Boolean;
begin
  Result := bReboot;
end;

К сожалению, это не работает, поскольку NeedRestart вызывается раньше ssPostInstall.

Есть ли другой способ инициировать перезагрузку?
Я не хочу устанавливать AlwaysRestart = yes

Я мог бы позволить всплывающему окну MsgBox сообщить пользователю и сказать ему, что делать. Но было бы гораздо приятнее, если бы он мог обрабатываться в рамках установки автоматически.

1 Ответ

1 голос
/ 21 октября 2019

Вы можете сделать установку раньше. Например, сразу после установки external.exe, используя AfterInstall:

[Files]
Source: "external.exe"; DestDir: "{app}"; AfterInstall: InstallDriver
[Code]
procedure InstallDriver;
begin
  if Exec(ExpandConstant('{app}\external.exe'), '-install', '', SW_SHOW,
          ewWaitUntilTerminated, ResultCode) then
  begin
    { handle success if necessary; ResultCode contains the exit code }
  end
    else
  begin
    { handle failure if necessary; ResultCode contains the error code }
    bReboot := true;
  end;
end;

Другой вариант - использовать шаг ssInstall (или даже PrepareToInstall событие ) и извлечение файла программным способом, используя ExtractTemporaryFile.


Кстати, если external.exe является только установщиком, вы можете захотеть "установите его на {tmp} (чтобы он автоматически удалялся).

...