Search code examples
installationinno-setuprestart

Inno Setup conditional restart based on result of executable call


My Inno Setup script is used to install a driver. It runs my InstallDriver.exe after this file was copied during step ssInstall.

I need to ask the user to restart in some cases according to the value returned by InstallDriver.exe.

This means that I cannot put InstallDriver.exe in section [Run] because there's no way to monitor it's return value.

So I put it in function CurStepChanged() as follows:

procedure CurStepChanged(CurStep: TSetupStep);
var
  TmpFileName, ExecStdout, msg: string;
  ResultCode: Integer;
begin
  if  (CurStep=ssPostInstall)  then
  begin 
    Log('CurStepChanged(ssPostInstall)');
    TmpFileName := ExpandConstant('{app}') + '\InstallDriver.exe';
    if Exec(TmpFileName, 'I', '',  SW_HIDE, ewWaitUntilTerminated, ResultCode) then .......

However, I can't find a way to make my script restart at this stage.

I thought of using function NeedRestart() to monitor the output of the driver installer, but it is called earlier in the process. Does it make sense to call the driver installer from within NeedRestart()?


Solution

  • NeedRestart does not look like the right place to install anything. But it would work, as it's fortunately called only once. You will probably want to present a progress somehow though, as the wizard form is almost empty during a call to NeedRestart.


    An alternative is to use AfterInstall parameter of the InstallDriver.exe or the driver binary itself (whichever is installed later).

    #define InstallDriverName "InstallDriver.exe"
    
    [Files]
    Source: "driver.sys"; DestDir: ".."
    Source: "{#InstallDriverName}"; DestDir: "{app}"; AfterInstall: InstallDriver
    
    [Code]
    var
      NeedRestartFlag: Boolean;
    
    const
      NeedRestartResultCode = 1;
    
    procedure InstallDriver();
    var
      InstallDriverPath: string;
      ResultCode: Integer;
    begin
      Log('Installing driver');
      InstallDriverPath := ExpandConstant('{app}') + '\{#InstallDriverName}';
      if not Exec(InstallDriverPath, 'I', '',  SW_HIDE, ewWaitUntilTerminated, ResultCode) then
      begin
        Log('Failed to execute driver installation');
      end
        else
      begin
        Log(Format('Driver installation finished with code %d', [ResultCode]))
        if ResultCode = NeedRestartResultCode then
        begin
          Log('Need to restart to finish driver installation');
          NeedRestartFlag := True;
        end;
      end;
    end;
    
    function NeedRestart(): Boolean;
    begin
      if NeedRestartFlag then
      begin
        Log('Need restart');
        Result := True;
      end
        else
      begin
        Log('Do not need restart');
        Result := False;
      end;
    end;