我的WIX安装程序应检查该软件的先前安装版本。如果安装较旧,则应以相同的路径安装。我正在使用RegistrySearch执行此检查。

<Property Id="TARGETDIR">
    <RegistrySearch Id="InstallLocation" Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[ANYVERSION]" Name="InstallLocation" Type="directory" Win64="no" />
</Property>



其中[ANYVERSION]的定义

<Upgrade Id="MyGUID">
    <UpgradeVersion Property="OLDVERSION" IncludeMinimum="yes" IncludeMaximum="no" Maximum="$(var.VERSION)" Minimum="0.0.0.0" OnlyDetect="no" />
    <UpgradeVersion Property="NEWVERSION" IncludeMinimum="no" Minimum="$(var.VERSION)" Maximum="99.99.99.99" IncludeMaximum="no" OnlyDetect="yes" />
    <UpgradeVersion Property="EQUALVERSION" IncludeMinimum="yes" Minimum="$(var.VERSION)" Maximum="$(var.VERSION)" IncludeMaximum="yes" OnlyDetect="yes" />
    <UpgradeVersion Property="ANYVERSION" IncludeMinimum="yes" Minimum="0.0.0.0" Maximum="99.99.99.99" IncludeMaximum="yes" OnlyDetect="yes" />
</Upgrade>



当已经安装了我的软件的另一个版本时,我的检查工作正常。
如果没有较早安装我的软件,则检查也会正常进行,但有一个例外:当安装了另一个应用程序,该应用程序在HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion中写入了一个没有子节点(GUID)的条目(名称为installLocation) \ uncheck将返回此应用程序的installLocation。
我的支票有什么问题?
为什么RegistrySearch返回没有子节点的条目的installLocation?
是否可以通过RegistrySearch使其工作,还是我需要编写自己的CustomAction?

最佳答案

这是因为如果未找到任何版本,则ANYVERSION将为空,然后将该路径评估为HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall。

一种解决方案(虽然不太好用)是在另一个属性中捕获注册表搜索,并且如果通过属性设置自定义定义了ANYVERSION,则仅设置应该包含您的安装目录的属性(TARGETDIR在这里也可能不是正确的选择)行动。

08-20 00:20