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

Inno setup InnoSetup:如果安装在上一个目录中,请卸载/更新,inno-setup,Inno Setup,通过指定不同的安装目录,我们的软件的不同版本应该能够并行安装。但是,如果用户决定安装在安装了以前版本的目录中,则应更新该目录(即卸载此目录中的以前版本并安装新版本) 使用与中所述相同的AppId是不可选项的,因为否则无法并行安装。实际上,AppId正是正确的方法。允许将AppId指定为{code:…}常量。如中所述,这将被多次调用;至少在向导启动前和安装开始前各一次 第一次调用它时,您应该返回一个已知值(固定默认值[可能是空字符串]或从注册表检索到的一些最近使用的值),以帮助查找以前的值,特别是

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


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

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

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

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

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

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


进一步注意,如果存在以前的版本,则不应卸载;只需在顶部安装即可。通常不需要为此执行任何特殊操作,但在极少数情况下,您可能需要添加
[InstallDelete]
条目以删除现在的冗余文件。只要您维护上面关于
AppId
的规则,这将干净地运行。

我同意您的看法,这不是
AppId
的用例。我只需创建一个专用于存储已安装应用程序版本的注册表项,并将一个带有版本和路径的值写入app.folder(或直接卸载程序),并在卸载某个版本时从中删除一个值。这将简化您的代码,让您可以通过一个注册表项视图了解已安装的版本和位置。但是,这是您的选项吗(我不明白为什么不这样做,但有些人有时有严格的要求)?我不会这样做。这会让你迷失在随机生成的app.id的混合中。如果安装了5个并行版本,我不知道你会返回什么作为
AppId
?我从来没有建议随机生成它们;这是个坏主意。如果你再次阅读我说的内容,我建议你执行以下操作之一:[a]对于第一次安装,返回“MyApp”。对于第二次安装,返回“MyApp_2”,以此类推——附带的条件是,安装到与前一次安装相同的目录中时,必须返回与第一次相同的值,即您需要创建某种注册表列表(这是您自己建议的)。或[b]在id中使用目录名称本身,因此安装到
C:\Program Files\MyApp
可能会产生“MyApp\u CProgramFilesMyApp”等。任何一种方法都可以。