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。
InitializeSetup
在 DisableDirPage
is directive 评估之前触发(与您当前使用的 InitializeWizard
相反)。你的代码无论如何都属于那里。
我有一个 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。
InitializeSetup
在 DisableDirPage
is directive 评估之前触发(与您当前使用的 InitializeWizard
相反)。你的代码无论如何都属于那里。