WiX bundle中RegistrySearch检测Access Database Engine始终失败如何解决
问题原因
- 核心原因是64位Windows系统的WOW64注册表重定向机制:32位程序访问
HKLM\SOFTWARE路径时,系统会自动重定向到HKLM\SOFTWARE\Wow6432Node\,只有64位程序才会访问真实的HKLM\SOFTWARE路径。 - WiX的
RegistrySearch默认会继承安装包自身的架构属性,如果你的bundle是32位架构,默认只会搜索32位重定向路径下的注册表项,而64位版本的Microsoft Access Database Engine的注册表项默认写入64位路径,因此搜索失败。 - 你其余的RegistrySearch能正常工作,大概率是对应的注册表项刚好存在于默认搜索的重定向路径下。
解决方案
方案1:仅检测64位Access引擎(适配你当前要安装的64位安装包)
给RegistrySearch显式添加Win64="yes"属性,强制搜索64位注册表路径,修改后的代码如下:
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine" Result="exists" Variable="AccessDbInstalled" Win64="yes" /> <PackageGroup Id="AccessDb"> <ExePackage Id="AccessDb14" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes" SourceFile="Prereqs\AccessDatabaseEngine_X64.exe" InstallCommand="/quiet /norestart" InstallCondition="NOT AccessDbInstalled"> </ExePackage> </PackageGroup>
方案2:同时兼容32/64位Access引擎检测
如果需要避免用户已经安装了32位版本的Access引擎时重复安装,可以同时添加两个注册表搜索,只要任意一个存在就跳过安装:
<!-- 检测64位Access Database Engine --> <util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine" Result="exists" Variable="AccessDbInstalledX64" Win64="yes" /> <!-- 检测32位Access Database Engine --> <util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine" Result="exists" Variable="AccessDbInstalledX86" Win64="no" /> <PackageGroup Id="AccessDb"> <ExePackage Id="AccessDb14" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes" SourceFile="Prereqs\AccessDatabaseEngine_X64.exe" InstallCommand="/quiet /norestart" InstallCondition="NOT (AccessDbInstalledX64 OR AccessDbInstalledX86)"> </ExePackage> </PackageGroup>
内容的提问来源于stack exchange,提问作者prb
相关产品推荐
相关产品推荐

