WiX安装程序:获取正在升级的产品的版本

时间:2014-06-26 15:16:02

标签: wix wix3 major-upgrade

在从版本X到版本Y的主要升​​级期间,我需要有一个属性/变量,说明版本X正在升级。

使用WiX Installer构建的设置执行产品的重大升级时,有没有办法让版本号升级?

2 个答案:

答案 0 :(得分:2)

假设您正在使用WiX majorupgrade元素,当检测到升级时,WIX_UPGRADE_DETECTED属性的值将设置为要升级的产品的productcode。您可以将其传递到C ++ Win32 API MsiGetProductInfo(.... INSTALLPROPERTY_VERSIONSTRING ...)以获取版本字符串。我认为有一个DTF等效的ProductInstallation类,您使用该产品代码构建,然后获取版本。如果你没有使用majorupgrade元素,那么仍然会有一个像PREVIOUSVERSIONSINSTALLED这样的属性设置为productcode,所以它取决于你如何设置它。请注意,严格来说,您可以升级多个产品。这将在FindRelatedProducts之后完成。无论如何,这就是我所看到的。

我认为没有内置的方式来获取该版本。您需要知道升级实际上是先工作,所以您需要FindRelatedProducts升级搜索设置的属性。还有其他一些你可以做的事情,但我不知道他们是否适合你的情况。例如,如果您从外部程序启动MSI,它可以枚举相关产品到MSI的产品代码,获取版本并将其作为属性传递给命令行,以减少MSI需要做的事情,假设升级将会起作用,但在您的情况下这可能毫无用处。

答案 1 :(得分:0)

我从未尝试过,但您可以使用UPGRADINGPRODUCTCODE property检索要卸载的产品的产品代码。据我所知,它被设置为Upgrade table标识为“要删除”的产品代码列表(可能有几个要卸载的产品)。

然后,您可以使用简单的 VBScript 来检索系统上该产品代码的版本。下面的脚本有一个硬编码的产品代码,可以找到 Windows Movie Maker 。使用您自己的产品GUID进行更新。它还具有调用的Main函数。这是为了使脚本能够以交互方式运行,并通过MSI内的方法调用运行。该脚本需要一些时间才能完成:

   
Call Main

Sub Main

 strComputer = "."

 Set objWMIService = GetObject("winmgmts:" & _
  "{impersonationLevel=impersonate}!\\" & _
  strComputer & _
  "\root\cimv2")

 ' Select all product details for software matching input GUID
 Set colSoftware = objWMIService.ExecQuery _
     ("SELECT * FROM Win32_Product WHERE IdentifyingNumber=" & _
     "'" & "{B862B671-59FD-7457-AFA0-C738FB7ABD60}" & "'")

 ' For completeness allow multiple results, enumerate
 If colSoftware.Count > 0 Then
    For Each objSoftware in colSoftware
      MsgBox "Product Name: " & objSoftware.Name & vbCrLf & _
      "Product Code: " & objSoftware.IdentifyingNumber & vbCrLf & _
      "Package Code: " & objSoftware.PackageCode & vbCrLf & _
      "Local Package: " & objSoftware.LocalPackage & vbCrLf & _
      "Version: " & objSoftware.Version, vbInformation, _
      "Product Info"
    Next
  Else
    MsgBox "No product found."
 End If

End Sub