【问题标题】:Inno Setup "Select directory" page disabled/skipped when uninstalling an older version first首先卸载旧版本时禁用/跳过 Inno Setup“选择目录”页面
【发布时间】: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 常量。目录页面应始终显示,以便用户检查和更改路径。但是只有在没有要卸载的先前版本时才会显示目录页面。否则,如果无法自动检测到路径,则会跳过该页面并导致内部错误。

【问题讨论】:

    标签: inno-setup pascalscript


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 2011-09-18
      相关资源
      最近更新 更多