Inno Setup根据可执行调用的结果有条件地重新启动。

问题描述 投票:1回答:1

我的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()?

installer inno-setup restart
1个回答
3
投票

NeedRestart 看起来不像是安装任何东西的正确位置。但它会工作,因为它幸运地只被调用一次。你可能会想以某种方式呈现一个进度,因为在调用向导表单时,向导表单几乎是空的。NeedRestart.


另一种方法是使用 AfterInstall 参数InstallDriver.exe 或驱动二进制文件本身(以后来安装的为准)。

#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;
© www.soinside.com 2019 - 2024. All rights reserved.