我想枚举密钥名称。但。这里有什么问题吗?它不会返回所有名称。我检查子键,它返回总共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;
}
答案 0 :(得分:0)
正如@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;