如果是升级/重新安装,有没有办法丢弃在命令行上传递给安装程序的/TYPE
和/COMPONENTS
参数值,而是使用以前使用的值?
我可以从Registry中读取之前使用的值(或者根据文件的存在来确定细节,假设它们没有被手动更改)
我已阅读以下主题并可在UI模式下禁用“选择组件”页面
答案 0 :(得分:2)
你不能丢弃它们。
您可以做的是检查这些参数是否已提供,以及是否:
/TYPE=
和/COMPONENTS=
const
UninstallKey =
'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppId")}_is1';
function IsUpgrade: Boolean;
var
Value: string;
begin
Result :=
(RegQueryStringValue(HKLM, UninstallKey, 'UninstallString', Value) or
RegQueryStringValue(HKCU, UninstallKey, 'UninstallString', Value)) and
(Value <> '');
end;
function ShellExecute(hwnd: HWND; lpOperation: string; lpFile: string;
lpParameters: string; lpDirectory: string; nShowCmd: Integer): THandle;
external 'ShellExecuteW@shell32.dll stdcall';
function InitializeSetup(): Boolean;
var
Params, S: string;
Relaunch: Boolean;
I, RetVal: Integer;
begin
Result := True;
if IsUpgrade then
begin
Relaunch := False;
{ Collect current instance parameters }
for I := 1 to ParamCount do
begin
S := ParamStr(I);
if (CompareText(Copy(S, 1, 7), '/TYPES=') = 0) or
(CompareText(Copy(S, 1, 12), '/COMPONENTS=') = 0) then
begin
Log(Format('Will re-launch due to %s', [S]));
Relaunch := True;
end
else
begin
{ Unique log file name for the child instance }
if CompareText(Copy(S, 1, 5), '/LOG=') = 0 then
begin
S := S + '-sub';
end;
{ Do not pass our /SL5 switch }
if CompareText(Copy(S, 1, 5), '/SL5=') <> 0 then
begin
Params := Params + AddQuotes(S) + ' ';
end;
end;
end;
if not Relaunch then
begin
Log('No need to re-launch');
end
else
begin
Log(Format('Re-launching setup with parameters [%s]', [Params]));
RetVal := ShellExecute(0, '', ExpandConstant('{srcexe}'), Params, '', SW_SHOW);
Log(Format('Re-launching setup returned [%d]', [RetVal]));
Result := (RetVal > 32);
{ if re-launching of this setup succeeded, then... }
if Result then
begin
Log('Re-launching succeeded');
{ exit this setup instance }
Result := False;
end
else
begin
Log(Format('Elevation failed [%s]', [SysErrorMessage(RetVal)]));
end;
end;
end;
end;
该代码适用于Inno Setup的Unicode版本。
可以进一步改进代码以使主安装程序等待子安装程序完成。什么时候可以有所作为,特别是如果安装程序是由某个自动部署过程执行的。