RegEnumKeyExW не возвращает все вложенные ключи имени - PullRequest
0 голосов
/ 23 ноября 2018

Я хочу перечислить имя ключа.но.здесь что-то не так.это не возвращает все имя.я проверяю 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;
    }

1 Ответ

0 голосов
/ 26 ноября 2018

Как говорит @Hans Passant, вы должны сбросить длину cbName, но на самом деле не MAX_KEY_LENGTH.Если длина буфера недостаточна для имени ключа, RegEnumKeyExW получит ошибку.Добавьте параметр в RegQueryInfoKeyW выше, чтобы получить максимальную длину имени подключа:

DWORD cbMaxSubKeyLen;
if (RegQueryInfoKeyW(hKey, NULL, NULL, NULL, &subKeys, &cbMaxSubKeyLen, NULL, NULL, NULL, NULL, NULL, &ftLastWriteTime) == ERROR_SUCCESS)

Затем в цикле for сбросьте cbName = cbMaxSubKeyLen;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...