Inno Setup 根据可执行调用的结果有条件地重启
Inno Setup conditional restart based on result of executable call
我的 Inno Setup 脚本用于安装驱动程序。在步骤 ssInstall
.
中复制此文件后,它运行我的 InstallDriver.exe
我需要根据InstallDriver.exe
编辑的值return要求用户在某些情况下重新启动。
这意味着我不能将 InstallDriver.exe
放在 [Run]
部分,因为无法监控它的 return 值。
所以我把它放在函数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
.
期间向导表单几乎是空的
另一种方法是使用 InstallDriver.exe
的 AfterInstall
parameter 或驱动程序二进制文件本身(以稍后安装的为准)。
#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;
我的 Inno Setup 脚本用于安装驱动程序。在步骤 ssInstall
.
InstallDriver.exe
我需要根据InstallDriver.exe
编辑的值return要求用户在某些情况下重新启动。
这意味着我不能将 InstallDriver.exe
放在 [Run]
部分,因为无法监控它的 return 值。
所以我把它放在函数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
.
另一种方法是使用 InstallDriver.exe
的 AfterInstall
parameter 或驱动程序二进制文件本身(以稍后安装的为准)。
#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;