InnoSetup:如果安装在上一个目录中,则卸载/更新

时间:2014-06-03 13:19:56

标签: inno-setup

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

使用InnoSetup FAQ中描述的相同AppId是没有选项,因为否则无法并行安装。

1 个答案:

答案 0 :(得分:3)

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

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

在显示wpSelectDir并且用户选择了目的地路径后,您应该返回" real"来自后续函数调用的AppId。它取决于您使用什么价值,但您必须满足以下要求:

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

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

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

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