RegEnumKeyExW不返回所有名称子项

时间:2018-11-23 07:35:47

标签: c++ windows visual-studio winapi

我想枚举密钥名称。但。这里有什么问题吗?它不会返回所有名称。我检查子键,它返回总共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;
    }

1 个答案:

答案 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;