【问题标题】:Inno Setup: Disable components page on upgradeInno Setup:升级时禁用组件页面
【发布时间】:2013-08-30 09:23:44
【问题描述】:

有没有办法禁用升级的组件页面?我想启用我的软件升级,但我不想让用户在升级时更改组件的选择。 而是从第一次安装升级所有现有组件的安装程序。

我担心用户在升级过程中选择的组件较少​​,这些缺少的组件将继续安装为旧版本,而您会一团糟。

我在脚本中添加了以下内容:

[Setup]
DisableDirPage=auto
DisableProgramGroupPage=auto
DirExistsWarning=auto

我只需要一种方法来禁用组件页面并使用先前安装(完整安装)的选择进行升级。这可能吗?

我找到了一个相关的指令:

[Setup]
UsePreviousTasks=true

UsePreviousTasks 正在从注册表中读取现有部分,这很好。现在我需要找到一种方法来隐藏选择窗口。

谢谢,
沃尔夫冈

【问题讨论】:

  • 请注意,如果用户选择的组件少于最初选择的组件,Inno 已经显示警告消息(默认情况下无论如何都会选择与以前相同的组件集)。所以即使没有隐藏页面,如果发生这种情况,那是因为用户已经明确决定这样做,尽管有警告。既然如此,何不让他们拥有呢?

标签: installation inno-setup


【解决方案1】:

要对用户隐藏页面,请使用ShouldSkipPage 事件方法。如果您在此方法中返回 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
[Code]
const
  UninstallKey = 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppId")}_is1';

function IsUpgrade: Boolean;
var
  Value: string;
begin
  Result := (RegQueryStringValue(HKLM, UninstallKey, 'UninstallString', Value) or
    RegQueryStringValue(HKCU, UninstallKey, 'UninstallString', Value)) and (Value <> '');
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := (PageID = wpSelectComponents) and IsUpgrade;
end;

您提到的另一个选项可能是禁用页面的所有控件。下一个脚本显示了如何检查安装是否为升级,如果是,则禁用“选择组件”向导页面上的所有控件:

[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
[Code]
const
  UninstallKey = 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppId")}_is1';

function IsUpgrade: Boolean;
var
  Value: string;
begin
  Result := (RegQueryStringValue(HKLM, UninstallKey, 'UninstallString', Value) or
    RegQueryStringValue(HKCU, UninstallKey, 'UninstallString', Value)) and (Value <> '');
end;

procedure DisablePageControls(Page: TNewNotebookPage);
var
  I: Integer;
begin
  Page.Enabled := False;
  for I := 0 to Page.ControlCount - 1 do
    Page.Controls[I].Enabled := False;
end;

procedure InitializeWizard;
begin
  if IsUpgrade then
    DisablePageControls(WizardForm.SelectComponentsPage);
end;

【讨论】:

  • 您的 IsUpgrade 在 64 位系统上安装 32 位时失败。卸载密钥位于 HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall...
  • @LonelyPixel, are you sure ?
  • 是的,我使用 regedit 来验证我的发现。而且这个和你的密钥都不能在脚本中正常工作。我被困住了。 InnoSetup 在任何地方都找不到密钥。
  • 使用进程监视器,我看到了问题。 AppId 以{ 开头,为了逃避它,它必须加倍。您的代码没有考虑到这一点,InnoSetup 有效地查找密钥 ...Uninstall\{{99...
  • 我不考虑这种情况,因为在我的示例中 AppId 没有花括号。顺便提一句。您正在运行 64 位 regedit,而您在重定向器节点下看到的是 32 位视图。
【解决方案2】:

TLama 的回答中提到的IsUpgrade 函数有一个错误。如果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;

为这个函数保留单独的const,它不适用于那个额外的函数调用。

除此之外,64 位系统似乎不会引起任何问题。如果 InnoSetup 在 32 位模式下运行,则注册表虚拟化已生效并已将您重定向到正确的键。

【讨论】:

  • 它有你的错误。不是我的例子。此外,您可以将其保持在函数之外。您可以在常量中使用 %s 数据类型指示符,在函数内部使用 Format 函数。
  • 没错,但仍然是一个错误。向任何开发人员询问与开发人员有不同(但有效)用例的用户。 ;-) 关于注册表项:我认为它足够具体,可以将其保留在使用它的功能中。它不会把东西分散这么远。
【解决方案3】:

类似的东西:

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;

【讨论】:

  • 它禁用了组件...找不到隐藏页面的方法:S
  • 这段代码可以简化,不需要第二个if语句。
  • ExtraOptionAvailable 是什么?您如何检测到它是升级?无论如何,有ShouldSkipPage 事件,您可以告诉向导跳过您选择的页面。这将对用户隐藏页面。
猜你喜欢
  • 1970-01-01
  • 2011-01-28
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多