【发布时间】:2018-11-23 07:35:47
【问题描述】:
我想枚举键名。但。这里有什么问题吗。它不会返回所有名称。我检查子键它返回 12 个总键。在 RegEnumKeyExW 中循环时,它只返回 3 个名称而不是 12 个名称。它只返回 1,2 和 5 名称键
在 HKEY_CURRENT_USER 键中。有 12 键。
应用事件
控制台
控制面板
环境
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;
}
【问题讨论】:
-
尝试以较少的权限打开密钥,
RegEnumKeyExW只需要KEY_ENUMERATE_SUB_KEYS。您无需先调用RegQueryInfoKeyW,只需循环直到RegEnumKeyExW失败。 -
起初 Reg api 未设置
GetLastError()但返回错误代码。第二 - 您在调用RegEnumKeyExW时未初始化cbName的错误。这是in-out 参数,在调用之前必须指定lpName参数指定的缓冲区大小,以字符为单位。所以在你的代码中必须是&(cbName = RTL_NUMBER_OF(keyName)) -
当 API 函数的行为不符合预期时,您必须重新阅读文档。您将看到的其中一件事是如何为此函数执行错误处理,实际上是所有注册表 api 函数。
-
修复:DWORD cbName = MAX_KEY_LENGTH;现在它对于第一个子键是偶然的,并且只有在名称较短时才能再次起作用。所以确实是 1、2 和 5。
标签: c++ windows visual-studio winapi