Inno setup “创新设置”;选择目录";首次卸载旧版本时页面被禁用/跳过

Inno setup “创新设置”;选择目录";首次卸载旧版本时页面被禁用/跳过,inno-setup,pascalscript,Inno Setup,Pascalscript,我有一个Inno安装程序,可以运行旧版本的卸载程序(如果已安装)。如果发生卸载过程,目录页将被禁用,这会导致内部错误,因为常量app未初始化 新版本(1.3)不再可卸载,但如果以前安装了1.1或1.2版,则需要运行卸载程序。 由于这是一个现有程序的插件,我需要找到它的目录。我试图从注册表中提取这些信息,并将有关插件安装的信息也保存在注册表中。如果安装了以前的版本,我会在这里找到卸载程序路径,并在继续安装过程之前运行它 [设置] … DefaultDirName={commonpf32}\Luca

我有一个Inno安装程序,可以运行旧版本的卸载程序(如果已安装)。如果发生卸载过程,目录页将被禁用,这会导致内部错误,因为常量
app
未初始化

新版本(1.3)不再可卸载,但如果以前安装了1.1或1.2版,则需要运行卸载程序。 由于这是一个现有程序的插件,我需要找到它的目录。我试图从注册表中提取这些信息,并将有关插件安装的信息也保存在注册表中。如果安装了以前的版本,我会在这里找到卸载程序路径,并在继续安装过程之前运行它

[设置]
…
DefaultDirName={commonpf32}\Lucasart\星球大战前线II\GameData\
AppendDefaultDirName=否
…
可卸载=否
DisableWelcomePage=否
direxistswaning=否
DisableProgramGroupPage=是
…
[登记处]
根:香港中文大学;子键:“软件\GTAnakin”;标志:UnisDeleteKeyIfEmpty
根:香港中文大学;子键:“软件\GTAnakin\SWBF2REMASTER”;标志:未删除键
…
[守则]
…
程序初始化;
变量
UrlLabel:TNewStaticText;
取消按钮:t按钮;
UninstPath:string;
iResult:整数;
InstallDir:字符串;
开始
CancelBtn:=WizardForm.CancelButton;
UrlLabel:=TNewStaticText.Create(WizardForm);
urlabel.Top:=CancelBtn.Top+(CancelBtn.Height div 2)-(urlabel.Height div 2);
UrlLabel.Left:=WizardForm.ClientWidth-CancelBtn.Left-CancelBtn.Width;
标题:=ExpandConstant('{cm:txtHomePageLink}');
urlabel.Font.Style:=urlabel.Font.Style+[fsUnderline];
urlabel.Cursor:=crHand;
urlabel.Font.Color:=clHighlight;
urlabel.OnClick:=@urlabelclick;
UrlLabel.Parent:=WizardForm;
WizardForm.DirEdit.Text:='';
如果RegQueryStringValue(HKEY_LOCAL_MACHINE,'SOFTWARE\lucasart\Star Wars Battlefront II\1.0','ExePath',InstallDir),则开始
如果文件存在(InstallDir),则开始
InstallDir:=提取文件路径(InstallDir);
删除(InstallDir,length(InstallDir),1);
WizardForm.DirEdit.Text:=InstallDir;
结束;
结束;
如果RegQueryStringValue(HKEY_当前_用户,'Software\GTAnakin\SWBF2REMASTER','UninstPath',UninstPath)则开始
Exec(UninstPath、/SILENT/NORESTART/SUPPRESSMSGBOXES、“”、SW_HIDE、ewwaitunterminated、iResult)
结束;
结束;
…

我希望安装程序尝试从注册表自动检测安装路径,并预定义
app
常量。目录页面应始终显示,以便用户可以检查和更改路径。但目录页面仅在没有要卸载的早期版本时显示。否则,如果无法自动检测路径,将跳过该页并导致内部错误。

将卸载代码移动到


InitializeSetup
在被评估之前被触发(与您当前使用的
InitializeWizard
相反)。而且你的代码仍然属于那里。

将你的卸载代码移动到

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