通过指定不同的安装目录,我们的软件的不同版本应该能够并行安装。但是,如果用户决定安装在先前版本的安装目录中,则应更新该目录(也就是卸载此目录中的先前版本并安装新版本)。
不能选择使用与 InnoSetup FAQ 中描述的相同的 AppId,否则无法并行安装。
最佳答案
实际上 AppId
正是这样做的正确方法。 AppId
允许指定为 {code:...}
常量。如 help for that value 中所述,这将被多次调用;在向导启动之前至少一次,在安装正确开始之前至少一次。
第一次调用时,您应该返回一个已知值(固定的默认值 [可能是一个空字符串] 或从注册表中检索到的一些最近使用的值)以帮助先前值查找,特别是如果用户确实决定只安装一个实例。请注意,为了获得最佳用户体验,您应该尝试在任何后续安装(例如第一次安装或最近安装)中为先前安装的实例返回“真实”有效值,但这不是必需的。
在显示 wpSelectDir
并且用户选择了他们的目标路径后,您应该从对该函数的后续调用中返回“真实”的 AppId
。使用什么值取决于您,但您必须满足以下要求:
一种方法是使用特定于应用程序的固定前缀,后跟目标目录的编码形式(至少去除反斜杠)。另一种方法是在现有安装的注册表中维护一个列表,并使用数字后缀指示特定实例在该列表中的位置(请记住,如果它们被无序卸载,则最终可能会不连续)。
(如果您确实维护了以前安装的实例的列表,那么这将提供其他选项来改善用户体验,例如通过自定义向导页面明确询问他们是要升级现有实例还是安装新实例,并在前一种情况你可以让他们从实例列表中选择而不是显示
wpSelectDir
。当然,这种方式需要相当多的代码。)进一步注意,如果存在以前的版本,则不应卸载;只需安装在顶部。通常你不需要为此做任何特别的事情,但在极少数情况下你可能想要添加
[InstallDelete]
条目来删除现在冗余的文件。只要您维护 AppId
的上述规则,它就会正常运行。关于inno-setup - InnoSetup : uninstall/update if install in the previous directory,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24016296/