【问题标题】:InnoSetup: uninstall/update if install in the previous directoryInnoSetup:如果安装在上一个目录中,则卸载/更新
【发布时间】:2014-06-17 07:12:47
【问题描述】:

我们的软件的不同版本应该能够通过指定不同的安装目录来并行安装。但是如果用户决定安装在以前版本的安装目录中,它应该更新它(也就是卸载这个目录中的以前版本并安装新版本)。

使用与InnoSetup FAQ 中描述的相同的 AppId 是不可行的,因为否则无法并行安装。

【问题讨论】:

  • 我同意你的观点,这不是AppId 的用例。我只会创建一个专门用于存储应用程序已安装版本的注册表项,并写入一个带有应用程序版本和路径的值。安装某个版本时文件夹(或直接卸载程序),并在卸载某个版本时从那里删除一个值。这将简化您的代码,并为您提供一个选项,让您可以通过一个注册表键视图了解哪些版本和安装位置。但是,这对你来说是一个选择吗(我不明白为什么不这样做,但有些人有时有严格的要求)?

标签: inno-setup


【解决方案1】:

实际上AppId 正是正确的方法。允许将AppId 指定为{code:...} 常量。如help for that value 中所述,这将被多次调用;至少在向导开始之前一次,在安装正确开始之前一次。

第一次调用时,您应该返回一个已知值(固定默认值 [可能是空字符串] 或从注册表中检索到的一些最近使用的值)以帮助查找先前的值,尤其是如果用户确实决定只安装一个实例。请注意,为了获得最佳用户体验,您应该尝试在任何后续安装(例如,第一次此类安装或最近一次安装)中为先前安装的实例返回“真实”有效值,但这不是必需的。

在显示wpSelectDir 并且用户选择了他们的目标路径后,您应该从后续调用函数中返回“真实的”AppId。使用什么值取决于您,但您必须满足以下要求:

  • 它对于您的应用程序必须是唯一的(任何其他应用程序都不应使用相同的值)。
  • 它对于您的应用程序的特定实例必须是唯一的(单独文件夹中的并行安装必须具有不同的值)。
  • 必须针对您的应用程序的特定实例进行修复(如果您的应用程序安装到特定文件夹中,则尝试重新安装到同一文件夹中而没有干预卸载必须产生与上次完全相同的值;如果已卸载首先,它可以产生相同的值[只要它仍然是唯一的],但这不是必需的)。

这样做的一种方法是使用特定于应用程序的固定前缀,后跟目标目录的编码形式(至少去除反斜杠)。另一种方法是在现有安装的注册表中维护一个列表,并使用一个数字后缀来指示特定实例在该列表中的位置(请记住,如果它们被无序卸载,这最终可能会不连续)。

(如果您确实维护了以前安装的实例的列表,那么这提供了其他选项来改善用户体验,例如通过自定义向导页面明确询问他们是要升级现有实例还是安装新实例,在前一种情况下,您可以让他们从实例列表中选择而不是显示wpSelectDir。当然,这种方式需要相当多的代码。)

进一步注意,如果存在以前的版本,则不应卸载;只需安装在顶部。通常你不需要为此做任何特别的事情,但在极少数情况下你可能想要添加[InstallDelete] 条目来删除现在冗余的文件。只要您维护AppId 的上述规则,这将正常运行。

【讨论】:

  • 我不会这样做。它要求在混合随机生成的应用程序中迷失自己。身份证。我看不出你会以AppId 的形式返回什么,如果有的话。安装了 5 个并行版本?
  • 我从不建议随机生成它们;那将是一个坏主意。如果您再次阅读我所说的内容,我建议您执行以下操作之一: [a] 对于第一次安装,返回“MyApp”。对于第二次安装,返回“MyApp_2”等——附带条件是安装到与前一个相同的目录必须返回与第一次相同的值,即。您需要创建某种注册表列表(这是您自己建议的)。或者 [b] 在 id 中使用目录名称本身,因此安装到 C:\Program Files\MyApp 可能会产生“MyApp_CProgramFilesMyApp”等。无论哪种方式都可以。
猜你喜欢
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 2020-08-24
  • 2012-11-03
  • 2018-08-17
  • 2017-01-07
相关资源
最近更新 更多