Рекурсивно искать реестр в с ++ - PullRequest
0 голосов
/ 29 апреля 2019

У меня проблема с функцией поиска в реестре.Моя цель - ввести имя ключа и пройти по дереву реестра, пока ключ с этим именем не будет найден.Моя функция может обходить все дерево (сначала в глубину), но проблема в поиске - я могу только успешно искать ключи на «первом уровне».Но если я попытаюсь найти, например, HKEY_CURRENT_USER \ AppEvents \ Schemes, ключ "Схемы" будет пропущен.Для поиска я использую флаг found, и идея состоит в том, чтобы продолжить поиск, пока он установлен в false.Но ни если (! Found) {// код функции}, ни пока (! Found), похоже, не сработали для меня.Что я пропустил и как ее решить?

Мой код:

#define BUFF_SIZE 400

void searchKeys(HKEY, string, TCHAR*, bool);

int main()
{
    HKEY rootKey= HKEY_CLASSES_ROOT;
    int keyMenu;
    TCHAR searchedName[BUFF_SIZE];
    bool found = false;


    cout << "Select root key: " << endl;
    cout << "1 - HKEY_CLASSES_ROOT\n2 - HKEY_CURRENT_USER\n3 - HKEY_LOCAL_MACHINE\n4 - HKEY_USERS\n5 - HKEY_CURRENT_CONFIG"<<endl;
    cin >> keyMenu;

    switch (keyMenu) {
    case 1: rootKey = HKEY_CLASSES_ROOT;
        break;
    case 2: rootKey = HKEY_CURRENT_USER;
        break;
    case 3: rootKey = HKEY_LOCAL_MACHINE;
        break;
    case 4: rootKey = HKEY_USERS;
        break;
    case 5: rootKey = HKEY_CURRENT_CONFIG;
        break;
    default: 
        cout << "This root key does not exist" << endl;
        system("PAUSE");
        return 0;
    }


    cout << "Enter key name to search: " << endl;
    cin >> searchedName;
    cout << "\n";

    string subKeyPath = "";

    searchKeys(rootKey, subKeyPath, searchedName, found);

    system("PAUSE");
    return 0;
}

void searchKeys(HKEY rootKey, string subKeyPath, TCHAR* searchedName, bool found) {
    HKEY subKey;
    DWORD subKeyCount, buffSize;
    char subKeyBuff[BUFF_SIZE];
    char result[BUFF_SIZE];

    TCHAR sbNameBuf[BUFF_SIZE];
    const char * subKeyName;
    subKeyName = subKeyPath.c_str();
    copy(subKeyPath.begin(), subKeyPath.end(), sbNameBuf);

    //if (!found) {
    //while (!found) {
        DWORD output = RegOpenKeyEx(rootKey, subKeyName, NULL, KEY_ALL_ACCESS, &subKey); //open specified root catalogue

        if (output != ERROR_SUCCESS) return;

        RegQueryInfoKey(subKey, NULL, NULL, NULL, &subKeyCount, NULL, NULL, NULL, NULL, NULL, NULL, NULL); //get info about root key

        if (!subKeyCount) return;

        for (DWORD i = 0; i < subKeyCount && !found; i++) {
            buffSize = sizeof(subKeyBuff);
            RegEnumKeyEx(subKey, i, subKeyBuff, &buffSize, NULL, NULL, NULL, NULL);

            string keyName = subKeyBuff;

            if (strcmp(subKeyBuff, searchedName) == 0) {
                found = true;
            }
            else {
                cout << subKeyBuff << endl;
            }

            keyName = subKeyPath + subKeyBuff + "\\";
            RegOpenKeyEx(rootKey, subKeyName, NULL, KEY_ALL_ACCESS, &subKey);
            RegQueryInfoKey(subKey, NULL, NULL, NULL, &subKeyCount, NULL, NULL, NULL, NULL, NULL, NULL, NULL); //get subKeyCount

            if (subKeyCount) {
                searchKeys(rootKey, keyName, searchedName, found);
            }

        }
    //}
    //}

}

1 Ответ

0 голосов
/ 10 мая 2019

Решением этой проблемы было просто сделать переменную bool found глобальной. Также комментарий engf-010 был полезен для просмотра ВСЕХ клавиш.

...