Inno Setup RegKeyExists返回False但注册表项实际存在问题
Inno Setup RegKeyExists 检测注册表项始终返回False问题排查
核心错误原因
代码中定义的注册表路径存在语法错误:子键路径开头多了一个前置反斜杠\。
Inno Setup 注册表类函数(包含RegKeyExists)的子键参数要求传入相对于所选根键的相对路径,不允许以反斜杠开头。你当前定义的OldVersionRegKey开头带\,会导致函数解析路径时,在根键下先查找名称为空的子项,再拼接后续的SOFTWARE\...路径,该路径在注册表中不存在,因此无论切换32位还是64位注册表视图,都会返回False。
直接修复方式
删除常量定义中路径开头的反斜杠即可:
const OldVersionRegKey = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppId}_is1';
其他补充排查点
如果修正路径后仍然检测失败,可逐一核对以下常见场景:
- 旧版本为当前用户安装:如果旧版本安装时选择的是「仅为我安装」而非「为所有用户安装」,卸载注册表项不会写入HKLM(机器级根键),而是写入HKCU(当前用户根键)下的对应路径,需要额外检测
HKCU32/HKCU64视图下的同路径项 - 安装包架构不匹配:32位安装包写入的卸载项,在64位系统上会自动重定向到WOW6432Node节点,对应Inno Setup的
HKLM32/HKCU32根键;只有64位安装包的卸载项才会写入HKLM64/HKCU64对应的无重定向路径 - 注册表虚拟化影响:如果旧版本安装时未获取管理员权限,向HKLM写入的操作会被Windows自动重定向到当前用户的虚拟化注册表路径,不会写入真实的HKLM节点,该场景下机器级路径检测必然失败
内容的提问来源于stack exchange,提问作者Merlor
相关产品推荐
相关产品推荐

