Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Installation Inno设置:在升级时禁用组件页面_Installation_Inno Setup - Fatal编程技术网

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的不同但有效的用例的用户;以及注册表项:我认为它足够具体,以使它保持在被使用的函数中。它不会散布周围的东西。