RegEnumKeyExW不返回所有名称子键
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RegEnumKeyExW不返回所有名称子键相关的知识,希望对你有一定的参考价值。
我想枚举键的名称。但。这里有什么问题。它不会返回所有名称。我检查subKeys它返回总共12个键。在RegEnumKeyExW中循环时,它只返回3个名称而不是12个名称。它只返回1,2和5名称键
在密钥HKEY_CURRENT_USER中。有12把钥匙。
- AppEvents
- 安慰
- 控制面板
- 环境
- EUDC
- 身份
- 键盘布局
- 网络
- 打印机
- 软件
- 系统
- 动荡的环境
这个代码
HKEY hKey;
if (RegOpenKeyExW(HKEY_CURRENT_USER, NULL, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
{
DWORD subKeys;
FILETIME ftLastWriteTime;
if (RegQueryInfoKeyW(hKey, NULL, NULL, NULL, &subKeys, NULL, NULL, NULL, NULL, NULL, NULL, &ftLastWriteTime) == ERROR_SUCCESS)
{
wchar_t keyName[MAX_KEY_LENGTH];
DWORD cbName;
for (DWORD i = 0; i < subKeys; i++)
{
if (RegEnumKeyExW(hKey, i, keyName, &cbName, NULL, NULL, NULL, &ftLastWriteTime) == ERROR_SUCCESS)
{
std::wcout << keyName << std::endl;
}
else
{
std::cout << GetLastError() << std::endl;
}
}
}
else
{
std::cout << GetLastError() << std::endl;
}
}
else
{
std::cout << GetLastError() << std::endl;
}
答案
正如@Hans Passant所说,你应该重置cbName
的长度,但实际上不是MAX_KEY_LENGTH
。如果密钥名称的buff长度不够,RegEnumKeyExW
将失败。在上面的RegQueryInfoKeyW
中添加参数以获取子项名称的最大长度:
DWORD cbMaxSubKeyLen;
if (RegQueryInfoKeyW(hKey, NULL, NULL, NULL, &subKeys, &cbMaxSubKeyLen, NULL, NULL, NULL, NULL, NULL, &ftLastWriteTime) == ERROR_SUCCESS)
然后在for循环中,重置cbName = cbMaxSubKeyLen;
以上是关于RegEnumKeyExW不返回所有名称子键的主要内容,如果未能解决你的问题,请参考以下文章