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

问题描述 投票:0回答:1

我有一个 Installshield 项目。

我添加了一个主要升级项目并更改了

Product version
Product code
Package code

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

Add / Remove
中)

我认为这与我的旧版本号是

1.0.4.23
而新版本号是
1.0.4.24
有关 - 这是一个问题吗?大升级会忽略版本属性这么小的变化吗?

在主要升级

common
选项卡中我选择了
Any earlier version

我记得几年前用版本号

1.1
1.2
做过,一切都很好,这就是我怀疑当前问题与版本号有关的主要原因。

windows-installer version installshield
1个回答
6
投票

我认为这与我的旧版本号有关 1.0.4.23,新版本是 1.0.4.24 - 这是一个问题吗?大升级会忽略这么小的版本变化吗?

是的,只有版本号的前三个字段对于重大升级有意义。第四个字段被简单地忽略。

这在重大升级 MSDN 页面的注释中进行了说明。

如果您想触发重大升级,您的新版本号必须为

1.0.5.0
或更大。


编辑:

正如克里斯托弗·佩因特指出的:

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

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

  1. 致电
    MsiGetProperty
    获取您产品的升级代码
  2. 调用
    MsiEnumRelatedProducts()
    枚举与您的产品具有相同 UpgradeCode 的所有产品。
  3. 致电
    MsiQueryProductState()
    验证
    MsiEnumRelatedProducts()
    返回的产品是否已实际安装。我遇到过一些情况,
    MsiEnumRelatedProducts()
    退回不再安装的孤立产品。因此,通过使用
    MsiQueryProductState()
    仔细检查安装状态,代码将会更加健壮。
  4. 调用
    MsiGetProductInfo()
    ,并以
    INSTALLPROPERTY_VERSIONSTRING
    作为
    szProperty
    参数的参数,查询已安装产品的版本。不要使用
    INSTALLPROPERTY_VERSION
    来代替,因为
    INSTALLPROPERTY_VERSION
    仅源自版本号的前三个字段,这是我们要避免的问题。
  5. 比较版本号时,请确保您不只是比较字符串,而是将字符串解析为以“.”分隔的字段。并单独比较各个字段
  6. 如果您找到要替换的匹配产品,请致电
  7. MsiSetProperty()
    ActionProperty 设置为该产品的 ProductCode,然后 RemoveExistingProducts
     进行操作。
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.