Installshield主要升级不会卸载旧版本

时间:2017-12-31 13:46:09

标签: windows-installer version installshield

我有一个Installshield项目。

我添加了一个重要的升级项目,并更改了Product versionProduct codePackage code

使用新安装程序安装后,旧版本仍然存在(在Add / Remove

我认为这与我的旧版本号为1.0.4.23且新版本为1.0.4.24这一事实有关 - 这是一个问题吗?主要升级是否忽略版本属性中的这么小的变化?

在主要升级common标签中,我选择了Any earlier version

我记得多年前使用的版本号为1.11.2并且一切都运行良好,这是我怀疑当前问题与版本号相关的主要原因。

1 个答案:

答案 0 :(得分:5)

  

我认为这与我的旧版本编号相关   1.0.4.23和新的是1.0.4.24 - 这是一个问题吗?主要升级是否忽略版本中的这么小的变化?

是的,只有版本号的前三个字段对于主要升级才有意义。第四个字段被忽略了。

这在Major Upgrades MSDN page的说明中说明。

如果您要触发重大升级,则新版本号必须为1.0.5.0或更高。

修改:

Christopher Painter指出:

  

如果你必须使用所有四个字段,有一种解决方法。您可以   创建一个自己执行的自定义操作   FindRelatedProducts并使用ProductCode设置action属性   然后,RemoveExistingProducts会对其起作用。

自定义操作可以像这样实现:

  1. 致电MsiGetProperty以获取您产品的 UpgradeCode
  2. 致电MsiEnumRelatedProducts()以枚举与您的产品具有相同 UpgradeCode 的所有产品。
  3. 致电MsiQueryProductState()以确认MsiEnumRelatedProducts()返回的产品是否已实际安装。我遇到过MsiEnumRelatedProducts()返回不再安装的孤立产品的情况。因此,通过使用MsiQueryProductState()仔细检查安装状态,代码将更加健壮。
  4. 使用INSTALLPROPERTY_VERSIONSTRING作为szProperty参数的参数调用MsiGetProductInfo(),以查询已安装产品的版本。请勿使用INSTALLPROPERTY_VERSION,因为INSTALLPROPERTY_VERSION仅来自版本号的前三个字段,即我们要避免的问题。
  5. 比较版本号时,请确保不要只比较字符串,而是parse the strings into the fields that are separated by '.' and compare the fields individually
  6. 如果您找到了要替换的匹配产品,请致电MsiSetProperty()ActionProperty设置为此产品的 ProductCode RemoveExistingProducts然后执行时。