【发布时间】:2020-04-27 21:24:12
【问题描述】:
如果安装了旧版本,我有一个运行旧版本卸载程序的 Inno Setup。如果卸载过程发生,目录页面会被禁用,这会导致内部错误,因为常量app 未初始化。
新版本 (1.3) 不再可卸载,但如果之前安装了 1.1 或 1.2 版本,我需要运行卸载程序。 由于这是现有程序的插件,我需要找到它的目录。我尝试从注册表中提取此信息,并将有关插件安装的信息也保存在注册表中。这是我找到卸载程序路径的地方,以防我安装了以前的版本并在继续安装过程之前运行它
[Setup]
…
DefaultDirName={commonpf32}\LucasArts\Star Wars Battlefront II\GameData\
AppendDefaultDirName=no
…
Uninstallable=no
DisableWelcomePage=no
DirExistsWarning=no
DisableProgramGroupPage=yes
…
[Registry]
Root: HKCU; Subkey: "Software\GTAnakin"; Flags: uninsdeletekeyifempty
Root: HKCU; Subkey: "Software\GTAnakin\SWBF2REMASTER"; Flags: uninsdeletekey
…
[Code]
…
procedure InitializeWizard;
var
UrlLabel : TNewStaticText;
CancelBtn : TButton;
UninstPath : string;
iResult : integer;
InstallDir : string;
begin
CancelBtn := WizardForm.CancelButton;
UrlLabel := TNewStaticText.Create(WizardForm);
UrlLabel.Top := CancelBtn.Top + (CancelBtn.Height div 2) - (UrlLabel.Height div 2);
UrlLabel.Left := WizardForm.ClientWidth - CancelBtn.Left - CancelBtn.Width;
UrlLabel.Caption := ExpandConstant('{cm:txtHomePageLink}');
UrlLabel.Font.Style := UrlLabel.Font.Style + [fsUnderline];
UrlLabel.Cursor := crHand;
UrlLabel.Font.Color := clHighlight;
UrlLabel.OnClick := @UrlLabelClick;
UrlLabel.Parent := WizardForm;
WizardForm.DirEdit.Text := '';
if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\LucasArts\Star Wars Battlefront II\1.0','ExePath', InstallDir) then begin
if FileExists(InstallDir) then begin
InstallDir := ExtractFilePath(InstallDir);
delete(InstallDir,length(InstallDir),1);
WizardForm.DirEdit.Text := InstallDir;
end;
end;
if RegQueryStringValue(HKEY_CURRENT_USER, 'Software\GTAnakin\SWBF2REMASTER', 'UninstPath', UninstPath) then begin
Exec(UninstPath, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResult)
end;
end;
…
我希望安装程序会尝试从注册表中自动检测安装路径并预定义 app 常量。目录页面应始终显示,以便用户检查和更改路径。但是只有在没有要卸载的先前版本时才会显示目录页面。否则,如果无法自动检测到路径,则会跳过该页面并导致内部错误。
【问题讨论】: