Inno Setup中RegQueryStringValue读取HKEY_LOCAL_MACHINE值失败
问题根因
代码读取不到注册表值、无日志输出由5个核心错误导致:
- 注册表重定向拦截:32位Inno Setup安装包在64位Windows系统运行时,默认会被系统重定向到
Wow6432Node下的32位兼容注册表路径,系统版本相关的注册表值存储在64位注册表路径下,不加特殊标记无法读取。 - 值类型不匹配:
CurrentMajorVersionNumber是REG_DWORD类型值,你使用读取字符串的RegQueryStringValue接口读取,类型不匹配会直接返回读取失败。 - 路径格式错误:传入的注册表子路径开头多了前置反斜杠
\,Inno Setup的注册表查询接口要求子路径不能以反斜杠开头,否则会直接查询失败。 - 函数逻辑缺失:
InitializeSetup是要求返回布尔值的生命周期函数,你没有给Result赋值,会返回随机值,可能直接中断安装流程。 - 日志未开启:Inno Setup的
Log接口输出需要开启安装日志才会落盘,运行安装包时必须加/log="你的日志保存路径.txt"启动参数,否则所有Log调用的内容都不会被记录。
修复方案
- 读取系统版本这类64位注册表路径下的值时,根键使用
HKEY_LOCAL_MACHINE_64替代原有的HKEY_LOCAL_MACHINE,绕过系统32位注册表重定向。 - 读取DWORD类型的
CurrentMajorVersionNumber时,改用RegQueryDWordValue接口,对应变量类型改为Cardinal(无符号32位整数),输出日志时用IntToStr转成字符串。 - 删掉注册表子路径开头多余的前置反斜杠。
- 给
InitializeSetup函数补上默认返回值,正常允许安装流程继续就赋值Result := True。 - 测试时加日志启动参数运行安装包,才能看到日志输出。
修复后的完整可运行代码:
function InitializeSetup(): Boolean; var ProductName: string; CurrentMajorVersionNumber: Cardinal; begin // 设置默认返回值,允许安装流程继续 Result := True; // 读取64位注册表下的字符串类型ProductName if RegQueryStringValue( HKEY_LOCAL_MACHINE_64, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ProductName', ProductName) then begin Log(' > ProductName:' + ProductName); end else begin Log(' > 读取ProductName失败,请检查权限或系统版本'); end; // 读取64位注册表下的DWORD类型CurrentMajorVersionNumber if RegQueryDWordValue( HKEY_LOCAL_MACHINE_64, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'CurrentMajorVersionNumber', CurrentMajorVersionNumber) then begin Log(' > CurrentMajorVersionNumber:' + IntToStr(CurrentMajorVersionNumber)); end else begin Log(' > 读取CurrentMajorVersionNumber失败,请检查权限或系统版本'); end; end;
补充说明:如果你已经在安装脚本里设置了ArchitecturesInstallIn64BitMode=x64,即安装包本身以64位进程运行,那直接用HKEY_LOCAL_MACHINE即可,不需要加_64后缀。但统一用HKEY_LOCAL_MACHINE_64读取系统版本信息兼容性更好,不受安装包位数配置影响。
内容的提问来源于stack exchange,提问作者YamatoChan
相关产品推荐
相关产品推荐

