WiX:获取已安装的第 3 方程序的版本

WiX: Obtaining version for already installed 3rd party program

我正在尝试将安装程序配置为仅在安装了特定版本的第 3 方应用程序时有条件地安装特定组件。

<编辑>
应该注意的是,第 3 方软件版本与我们的版本之间存在 1:1 对应关系。第 3 方软件有数十个这样的版本(加上每个月最多三个额外版本),所以我们不想进行手工编辑。我们的程序是针对所有版本的第 3 方软件自动构建的,但需要有条件地安装哪些文件。
<\编辑>

我只是将其部署为单个 .MSI,因此没有 Bootstrapper 等。 根据我的阅读和谷歌搜索,我相信我需要有一个升级部分,以确定应用程序当前将具有的 PRODUCTCODE(多个版本.. 因此可能有多个 PRODUCTCODE)。 然后可以使用此 PRODUCTCODE 从注册表中读取 DisplayVersion。

所以我有:

<Upgrade Id="{6D991503-3102-437E-B21D-471599D491AB}">
    <UpgradeVersion Minimum="0.0.0.0" OnlyDetect="yes" Property="CLEARSCADADETECTED" />
</Upgrade>

升级部分,然后..

<Property Id="CLEARSCADA_VER" Secure="yes" Hidden="no" Value="6.78.6626.1">
    <RegistrySearch Id="ClearSCADAVersionSearch"
                    Root="HKLM"
                    Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[CLEARSCADADETECTED]"
                    Name="DisplayVersion"
                    Type="raw"
                    Win64="yes" />
</Property>

用于 REGISTRYSEARCH。

PRODUCTCODE 查找似乎在工作,但 Registrysearch 没有..(我期待在 AppSearch 之后有 属性 CHANGE 条目)

FindRelatedProducts: Found application: {2ACE38B2-F142-4EFE-9AC7-B25514E4930E}
MSI (c) (F0:90) [23:17:39:598]: PROPERTY CHANGE: Adding CLEARSCADADETECTED property. Its value is '{2ACE38B2-F142-4EFE-9AC7-B25514E4930E}'.
Action ended 23:17:39: FindRelatedProducts. Return value 1.
...
AppSearch: Property: CLEARSCADA_VER, Signature: ClearSCADAVersionSearch
MSI (c) (F0:90) [23:17:39:629]: Note: 1: 2262 2: Signature 3: -2147287038 
Action ended 23:17:39: AppSearch. Return value 1.

我已经尝试对注册表查找进行硬编码(即用 {2ACE38B2-F142-4EFE-9AC7-B25514E4930E} 的静态文本替换 [CLEARSCADADETECTED]),没有任何更改。 对于检查内容的任何其他建议将不胜感激。

<编辑 2>
好吧,令人困惑的是,如果我引用 Version DWORD 值(而不是 DisplayVersion String 值),那么它确实正确读取为 #105781730。 RegistrySearch 是否可能不适用于 String 值?
<编辑 2>

<编辑 3>
耶...它的工作。而且我想它现在也已经工作了一段时间。 当我输入 Value='6.78.6626.1' 时,我应该意识到如果我测试它的版本已经是 '6.78.6626.1' 那么它就不会指示 属性 CHANGE。
<编辑 3>

贝文

不清楚您是否需要注册表搜索,因为您可以有多个 UpgradeVersion 元素,每个元素都有您想要的版本。因此,您在搜索时无需担心多个 ProductCode 值。此文档位于此处:

https://www.firegiant.com/wix/tutorial/upgrades-and-modularization/checking-for-oldies/

显示多个 UpgradeVersion 元素的示例。

话虽如此,最简单的方法是拥有一个 UpgradeVersion,它指的是您关心的确切版本范围,如果找到该范围内的任何内容,这将设置您的 属性。您只需要将最小值和最大值设置为值。

您的注册表搜索屏幕截图似乎显示了可能是 64 位系统上的本机注册表。您的搜索未明确设置 Win64,可能正在搜索 32 位注册表。

我没有使用实际的主要升级检测进行测试,但可能会尝试删除 Hidden 属性,这似乎会从日志中删除设置 属性 操作。我最初也删除了 Value 属性,但把它放回去,现在将它设置为 0:

<Property Id="CLEARSCADA_VER" Secure="yes" Value="0">
 <RegistrySearch Id="ClearSCADAVersionSearch"
                 Root="HKLM"
                 Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[CLEARSCADADETECTED]"
                 Name="DisplayVersion"
                 Type="raw"
                 Win64="yes" />
</Property>

我 运行 进行了快速测试,这对我有用。并且您正在使用 WiX 文件中的设置正确地搜索注册表的 64 位部分(前提是这确实是您要搜索的部分)。也许在 PhilDW 回答后您更新了您的问题?


我还验证了注册表搜索 不区分大小写。我不记得是不是。

要检查搜索和属性值,您可以使用脚本自定义操作进行调试(这样就没有编译和麻烦)。

  • VBScript 可以很好地进行调试,但不应该用于生产代码。
  • 我可以为显示 属性 值的 VBScript 自定义操作转储所需的 WiX 自定义操作元素,但我不想让这个答案比现在更冗长,如果你不想要。

您确定一次只安装一个版本的第 3 方应用程序吗?也许与供应商核实并确保运行他们将如何进行部署,这样可以避免您以后遇到突然出现的问题? 对其他包行为的依赖可能是一颗定时炸弹 - 它非常紧密地耦合在您的控制之外。不要听起来太戏剧化,这可能很好。只是提一下。如果你问我,检查这是经理的任务。

这有点你正在做的事情,但遗憾的是我经常遇到逻辑随着时间的推移变得越来越复杂,我最终不得不求助于自定义操作来处理各种边缘情况。希望你不必走那条路,因为你做的是正确的事