c++ - 注册表查询信息给出了不正确的值
问题描述
使用下面的代码,我一直在尝试查询某个注册表项下的值信息。我只对值的数量、值名称长度和值大小感兴趣。但是当我运行代码时,它只会给出正确的值数量。其他值太长且不正确。如果我延长它改变的值,但除了值的数量之外,除非我完全删除变量,否则这些值永远不会变短。
使用的代码:
HKEY openRegister(HKEY rootKey,const wchar_t* subKey)
{
HKEY hKey;
LONG result=RegOpenKeyEx(rootKey,subKey,0,KEY_QUERY_VALUE | KEY_WOW64_64KEY,&hKey);
if(result!=ERROR_SUCCESS)
{
if(result==ERROR_FILE_NOT_FOUND)
{
cout<<"Key not found"<<endl;
}
else
{
cout<<"Error opening key"<<endl;
}
}
return hKey;
}
bool infoKey(HKEY regKey,DWORD &numValues,DWORD &maxNameLen,DWORD &maxValueSize)
{
LONG result=RegQueryInfoKeyA
(
regKey,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
&numValues,
&maxNameLen,
&maxValueSize,
NULL,
NULL
);
if(result!=ERROR_SUCCESS)
{
cout<<"Error query info"<<endl;
return false;
}
else return true;
}
调用 openRegister 然后调用 infoKey 函数,给出以下输出:
Number of values: 2
Max name length: 12
Max value size: 12
在注册表编辑器中查看时,这是实际内容:
(default) | REG_SZ | (value not set)
string1 | REG_SZ | Hello
string2b | REG_SZ | Test
为什么“值的数量”只是正确的?我错过了一些非常明显的东西吗?
提前感谢,本吉。
解决方案
该lpcbMaxValueLen
参数输出以字节表示的最长数据的大小。您的示例中最长的数据是Hello
,它作为 Unicode 字符串(注册表内部存储字符串的格式)为 6 个字符,计算空终止符,大小为 12 个字节(每个字符 2 个字节)。所以maxValueSize
设置为 12 是准确的。
该lpcbMaxValueNameLen
参数输出以 Unicode 字符表示的最长名称的长度,不包括空终止符。您的示例中最长的名称是string2b
,长度为 8 个字符。所以你会期望maxNameLen
应该设置为 8,而不是 12。但显然有一个未记录的最小大小来命名缓冲区。为什么,谁知道呢。
附带说明一下,您正在使用 Unicode 函数打开密钥,然后使用 ANSI 函数查询其信息。您不应该像这样混合使用 ANSI 和 Unicode API。您应该使用RegQueryInfoKeyW()
而不是RegQueryInfoKeyA()
, 来匹配您的使用RegOpenKeyExW()
(RegOpenKeyEx()
调用,因为您传递给它一个wchar_t
字符串)。
推荐阅读
- javascript - 如何
- javascript - 如何从javascript中的输入字段中删除重复条目
- vue.js - 在 vue js 中只有一个列表从模板中出现
- javascript - 使用正则表达式去除 HTML 和 & 符号
- python - pygame - 在 event.key 处理程序导致立即处理 event.key 块之前返回键按下
- git - Git Push to Azure Master 状态不是“一切都是最新的”
- c# - 有没有办法在方法中访问实例本身引用?
- angular - 将选定的下拉 id 传递给另一个组件
- python - 使用具有向后依赖关系的 scipy 进行曲线拟合
- python - 每次在 Tkinter 中按下按钮时如何添加组合框?