Installation Inno设置:在升级时禁用组件页面
有没有办法禁用组件页面进行升级?我希望能够升级我的软件,但我不想允许用户在升级时更改组件的选择。 相反,安装程序可以从第一次安装升级所有现有组件 我担心如果用户在升级过程中选择较少的组件,那么这些丢失的组件将作为旧版本继续安装,而您将陷入混乱 我在脚本中添加了以下内容:Installation Inno设置:在升级时禁用组件页面,installation,inno-setup,Installation,Inno Setup,有没有办法禁用组件页面进行升级?我希望能够升级我的软件,但我不想允许用户在升级时更改组件的选择。 相反,安装程序可以从第一次安装升级所有现有组件 我担心如果用户在升级过程中选择较少的组件,那么这些丢失的组件将作为旧版本继续安装,而您将陷入混乱 我在脚本中添加了以下内容: [Setup] DisableDirPage=auto DisableProgramGroupPage=auto DirExistsWarning=auto 我只需要一种方法来禁用组件页面,并使用上一次安装完整安装的选择进行升
[Setup]
DisableDirPage=auto
DisableProgramGroupPage=auto
DirExistsWarning=auto
我只需要一种方法来禁用组件页面,并使用上一次安装完整安装的选择进行升级。可能吗
我发现了一个相关的指令:
[Setup]
UsePreviousTasks=true
UsePreviousTasks正在从注册表中读取现有部分,这很好。现在我需要找到一种隐藏选择窗口的方法
谢谢,
沃尔夫冈诸如此类:
if CurPageID=wpSelectComponents then
begin
if ExtraOptionAvailable() then
begin
Wizardform.ComponentsList.Checked[6] := true;
Wizardform.ComponentsList.ItemEnabled[6] := true;
end else begin
Wizardform.ComponentsList.Checked[6] := false;
Wizardform.ComponentsList.ItemEnabled[6] := false;
end;
end;
要对用户隐藏页面,请使用事件方法。如果在此方法中返回True,则该页面不会显示给用户。如果为False,页面将按正常方式显示。以下是如何检查安装是否为升级的示例,如果是,请跳过“选择组件向导”页面:
[Setup]
AppId=B75E4823-1BC9-4AC6-A645-94027A16F5A5
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
; here is the place for your [Components] section and the rest of your script
[Setup]
AppId=B75E4823-1BC9-4AC6-A645-94027A16F5A5
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
; here is the place for your [Components] section and the rest of your script
[守则]
常数
UninstallKey='Software\Microsoft\Windows\CurrentVersion\Uninstall\{SetupSettingAppId}_is1';
函数为:布尔型;
变量
值:字符串;
开始
结果:=RegQueryStringValueHKLM,UninstallKey,'UninstallString',值或
RegQueryStringValueHKCU,UninstallKey,'UninstallString',值和值;
终止
函数shouldSkipPageId:Integer:Boolean;
开始
结果:=PageID=wpSelectComponents和IsUpgrade;
终止
您提到的另一个选项可能是禁用页面的所有控件。下一个脚本与上一个脚本一样,显示如何检查安装是否为升级,如果是升级,则禁用“选择组件向导”页面上的所有控件:
[Setup]
AppId=B75E4823-1BC9-4AC6-A645-94027A16F5A5
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
; here is the place for your [Components] section and the rest of your script
[Setup]
AppId=B75E4823-1BC9-4AC6-A645-94027A16F5A5
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
; here is the place for your [Components] section and the rest of your script
[守则]
常数
UninstallKey='Software\Microsoft\Windows\CurrentVersion\Uninstall\{SetupSettingAppId}_is1';
函数为:布尔型;
变量
值:字符串;
开始
结果:=RegQueryStringValueHKLM,UninstallKey,'UninstallString',值或
RegQueryStringValueHKCU,UninstallKey,'UninstallString',值和值;
终止
过程禁用页面控制页面:TNewNotebookPage;
变量
I:整数;
开始
Page.Enabled:=False;
对于I:=0到Page.ControlCount-1 do
Page.Controls[I]。Enabled:=False;
终止
程序初始化;
开始
如果是升级,那么
禁用页面控制swizardform.SelectComponentsPage;
终止
TLama回答中提到的IsUpgrade函数有一个bug。如果AppId以{开头,必须加倍,则不会解决此问题,也不会找到它们的注册表项。下面是一个适用于我的更正函数:
function IsUpgrade: Boolean;
var
Value: string;
UninstallKey: string;
begin
UninstallKey := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\' +
ExpandConstant('{#SetupSetting("AppId")}') + '_is1';
Result := (RegQueryStringValue(HKLM, UninstallKey, 'UninstallString', Value) or
RegQueryStringValue(HKCU, UninstallKey, 'UninstallString', Value)) and (Value <> '');
end;
保留此函数的单独常量,它将无法处理额外的函数调用
除此之外,64位系统似乎不会引起任何问题。如果InnoSetup以32位模式运行,注册表虚拟化将生效,并已将您重定向到正确的注册表项。它禁用了组件…无法隐藏页面:此代码可以简化,无需第二条If语句。额外选项可用性是什么是否可以?您是如何检测到这是升级的?无论如何,您可以告诉向导跳过您选择的页面。这将对用户隐藏该页面。请注意,如果用户选择的组件少于最初选择的组件,则Inno已显示警告消息,默认情况下,选择的组件集与当前相同因此,即使不隐藏页面,如果出现这种情况,也是因为用户不顾警告明确决定这么做。在这种情况下,为什么不让他们这么做呢?您的IsUpgrade在64位系统上的32位安装失败。卸载密钥位于HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\uninstall@LonelyPixel,?是的,我使用regedit验证我的发现。这个和你的密钥在脚本中都不能正常工作。我卡住了。InnoSetup在任何地方都找不到密钥。使用Process Monitor,我看到了问题。AppId以{为了逃避它,它必须加倍。您的代码不考虑这一点,而iNoStup有效地查找密钥…卸载\{{99….我不考虑这种情况,因为我的示例中的AppId没有大括号。顺便说一句。您运行的是64位regedit,在重定向器节点下看到的是32位视图。它为您带来了错误。我的示例中没有。此外,您可以将该常量保留在函数之外。您可以在常量中使用%s数据类型指示符你的函数内部的格式化函数。true,但仍然是一个bug。询问任何开发人员关于不同于DEV的不同但有效的用例的用户;以及注册表项:我认为它足够具体,以使它保持在被使用的函数中。它不会散布周围的东西。