基于可执行调用的结果,Inno Setup条件重启

时间:2015-12-01 20:00:40

标签: installer inno-setup restart

My Inno Setup脚本用于安装驱动程序。在步骤InstallDriver.exe中复制此文件后,它会运行我的ssInstall

我需要让用户根据InstallDriver.exe返回的值在某些情况下重新启动。

这意味着我无法将InstallDriver.exe放入[Run]部分,因为无法监控它的返回值。

所以我把它放在函数CurStepChanged()中,如下所示:

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 .......

但是,我找不到在此阶段重新启动脚本的方法。

我想过使用函数NeedRestart()来监视驱动程序安装程序的输出,但是在此过程中会先调用它。 从NeedRestart()内调用驱动程序安装程序是否有意义?

1 个答案:

答案 0 :(得分:2)

NeedRestart看起来不适合安装任何东西。但它会起作用,因为幸运的是只召唤一次。您可能希望以某种方式呈现进度,因为在调用NeedRestart期间向导表单几乎为空。

另一种方法是使用InstallDriver.exe的{​​{3}}或驱动程序二进制文件本身(以后安装的那个)。

#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;