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