Wix Bootstrapper RegistrySearch无法找到注册表值问题求助
问题分析与解决方案
你遇到的日志错误显示系统在SOFTWARE\[COMPANY_NAME]\路径下找不到Bitness值,但你的代码里明明指定了完整路径SOFTWARE\[COMPANY_NAME]\[PRODUCTNAME],这说明实际执行时搜索路径可能发生了变化,或者存在注册表视图、变量替换的问题,以下是具体排查和修复方案:
1. 解决注册表重定向问题(32/64位视图差异)
Bootstrapper默认以32位进程运行,会自动将HKLM\SOFTWARE路径重定向到HKLM\SOFTWARE\Wow6432Node。如果你安装的是64位程序,注册表键实际存储在64位视图的HKLM\SOFTWARE\[COMPANY_NAME]\[PRODUCTNAME]下,32位进程无法直接读取到。
修复方法:在两个RegistrySearch节点中添加Win64="yes"属性,强制读取64位注册表视图:
<!-- Check if program is installed --> <util:RegistrySearch Id="CheckProgramInstalled" Root="HKLM" Key="SOFTWARE\[COMPANY_NAME]\[PRODUCTNAME]" Result="exists" Variable="ProgramInstalled" Win64="yes" /> <!-- Check bitness of the program --> <util:RegistrySearch Id="CheckProgramBitness" After="CheckProgramInstalled" Root="HKLM" Key="SOFTWARE\[COMPANY_NAME]\[PRODUCTNAME]" Value="Bitness" Result="value" Variable="ProgramBitness" Win64="yes" Condition="ProgramInstalled" />
2. 确认变量替换是否正确生效
日志中显示的搜索路径是SOFTWARE\[COMPANY_NAME]\,缺少了[PRODUCTNAME]部分,这很可能是[PRODUCTNAME]变量未被正确替换。请检查你的Bundle文件:
- 是否通过
<?define PRODUCTNAME="你的产品名"?>定义了该变量 - 变量名称是否拼写正确(区分大小写)
- 如果是通过外部参数传递变量,确认参数是否正确传入
3. 添加搜索执行条件避免无意义报错
第二个注册表搜索应该仅在程序已安装(即ProgramInstalled为true)时执行,否则当程序未安装时,注册表键不存在会触发错误。在CheckProgramBitness节点中添加Condition="ProgramInstalled"属性(如上面的代码示例),可以避免这种情况。
内容的提问来源于stack exchange,提问作者Leanne
相关产品推荐
相关产品推荐

