我想枚举键的名称。但。这里有什么问题。它不会返回所有名称。我检查subKeys它返回总共12个键。在RegEnumKeyExW中循环时,它只返回3个名称而不是12个名称。它只返回1,2和5名称键
在密钥HKEY_CURRENT_USER中。有12把钥匙。
这个代码
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;