You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用RegQueryInfoKeyA查询注册表信息仅值数量正确其余参数错误原因

问题原因分析

你遇到的返回值不符合预期是两个典型的Windows API使用错误导致的:

1. 字符集API混用错误

你打开注册表时传入的子键是const wchar_t*宽字符类型,说明你使用的是Unicode版本的RegOpenKeyExW,但查询键信息时主动调用了ANSI版本的RegQueryInfoKeyA,两种不同字符集的API混用会导致名称长度计算出现偏差,ANSI版本对宽字符名称转码时会返回不符合预期的长度结果。
修复方案:将RegQueryInfoKeyA改为RegQueryInfoKeyW,或者直接使用通用宏RegQueryInfoKey自动匹配项目的字符集配置。

2. 参数单位理解错误

你对RegQueryInfoKey的输出参数单位理解有误,微软官方对这三个参数的定义如下:

  • lpcValues:返回键下的值数量,未赋值的默认值不会被统计,所以你返回2是正确的,对应你手动创建的string1、string2b两个值
  • lpcMaxValueNameLen:返回最长值名称的字符数,不包含末尾的NULL终止符,如果要用来分配名称缓冲区需要额外+1存储终止符
  • lpcMaxValueDataLen:返回最长值数据的字节数,不是字符数。你示例里最长的数据是Hello,REG_SZ类型在Windows注册表中以宽字符存储,加上末尾的NULL终止符总大小为(5+1)*2=12字节,和你返回的maxValueSize结果完全一致,你觉得偏大是因为误把字节数当成了字符数。

内容的提问来源于stack exchange,提问作者ManlishPotato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:24:02