RegEnumKeyExW不返回所有名称子键

问题描述 投票:-1回答:1

我想枚举键的名称。但。这里有什么问题。它不会返回所有名称。我检查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;
    }
c++ windows visual-studio winapi
1个回答
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;

© www.soinside.com 2019 - 2024. All rights reserved.