InnoSetup:卸载/更新如果安装在前一个目录



不同版本的软件应该能够通过指定不同的安装目录来并行安装。但是,如果用户决定在安装旧版本的目录下安装,则应该更新该目录(即卸载该目录下的旧版本并安装新版本)。

不能使用与InnoSetup FAQ中描述的相同的AppId,否则无法并行安装

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

第一次调用

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

在显示wpSelectDir并且用户选择了目标路径之后,您应该从对该函数的后续调用中返回"真正的"AppId。使用什么值由您决定,但您必须满足以下要求:

  • 它必须是你的应用程序唯一的(其他应用程序不应该使用相同的值)。
  • 对于应用程序的特定实例必须是唯一的(在单独的文件夹中并行安装必须具有不同的值)。
  • 它必须针对你的应用程序的特定实例进行修复(如果你的应用程序被安装到一个特定的文件夹中,在没有卸载的情况下重新安装到同一个文件夹中必须产生与上次完全相同的值;如果它是先卸载,那么它可以产生相同的值[只要它仍然是唯一的],但这不是一个要求)。
一种方法是使用特定于应用程序的固定前缀,后跟目标目录的编码形式(至少去掉反斜杠)。另一种方法是在现有安装的注册表中维护一个列表,并使用数字后缀指示特定实例在该列表中的位置(请记住,如果它们按顺序卸载,这可能会导致不连续)。

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

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

相关内容

最新更新