RegEnumKeyExW不返回所有名称子键

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RegEnumKeyExW不返回所有名称子键相关的知识,希望对你有一定的参考价值。

我想枚举键的名称。但。这里有什么问题。它不会返回所有名称。我检查subKeys它返回总共12个键。在RegEnumKeyExW中循环时,它只返回3个名称而不是12个名称。它只返回1,2和5名称键

在密钥HKEY_CURRENT_USER中。有12把钥匙。

  1. AppEvents
  2. 安慰
  3. 控制面板
  4. 环境
  5. EUDC
  6. 身份
  7. 键盘布局
  8. 网络
  9. 打印机
  10. 软件
  11. 系统
  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;

以上是关于RegEnumKeyExW不返回所有名称子键的主要内容,如果未能解决你的问题,请参考以下文章

python winreg总结

如何一次对字典的所有键、子键、子子键等进行排序?

VS c++ 删除子键不起作用!错误代码 0

GetSubKeyNames 函数在 C# 和 Visual Basic 中返回不同的子键

遍历注册表某一子键下的所有键值

删除带有子键的键