WiX:获取已安装的第三方程序

时间:2018-03-21 13:00:09

标签: wix windows-installer registry version wix3.11

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

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

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

所以我有:

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

用于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之后输入一个PROPERTY 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]),没有任何更改。 Regedit showing registry key exists 我们非常感谢任何其他有关检查内容的建议。

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

&lt; EDIT 3&gt;
是的......它正在工作。而且我猜它现在已经工作了一段时间了。 当我把Value =&#39; 6.78.6626.1&#39;时,我应该意识到,如果我测试它的版本已经是&#39; 6.78.6626.1&#39;然后它不会表明物业变更。
&lt;编辑3&gt;

贝文

2 个答案:

答案 0 :(得分:1)

我没有使用实际的主要升级检测进行测试,但可能会尝试删除似乎从日志中删除set属性操作的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可以很好地进行调试,但不应该用于生产代码。
  • 我可以在所需的WiX自定义操作元素中转储为您显示属性值的VBScript自定义操作,但我不想让这个答案比以前更加冗长,如果你不这样做的话。我想要它。

您确定一次只能安装一个版本的第三方应用程序吗?也许对供应商进行检查,以及他们将如何进行部署的一些保证可以在以后为您节省突发问题? 对其他软件包行为的依赖可能是一个定时炸弹 - 它是非常紧密地耦合在你的控制之外。不要听起来太戏剧化,这可能很好。只是提到它。如果你问我,检查这是一个经理任务。

它有点整洁你正在做什么,但遗憾的是我经常会遇到逻辑随着时间的推移变得更加复杂,我最终不得不求助于自定义动作来处理各种边缘情况。我们希望你不要走这条路,因为你做的是正确的事trying to avoid custom actions

答案 1 :(得分:0)

您不清楚是否需要注册表搜索,因为您可以拥有多个UpgradeVersion元素,每个元素都包含您想要的版本。因此,在搜索中不需要担心多个ProductCode值。这里的文档:

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

显示了多个UpgradeVersion元素的示例。

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

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