调用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
相关产品推荐
相关产品推荐

