Inno Setup "Select directory" 页面 disabled/skipped 当先卸载旧版本时

Inno Setup "Select directory" page disabled/skipped when uninstalling an older version first

我有一个 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.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 常量。目录页面应始终显示,以便用户可以检查和更改路径。但只有在没有要卸载的先前版本时才会显示目录页面。否则,如果无法自动检测到路径,将跳过页面并导致内部错误。

将您的卸载代码移至 InitializeSetup event function

InitializeSetupDisableDirPage is directive 评估之前触发(与您当前使用的 InitializeWizard 相反)。你的代码无论如何都属于那里。