У меня проблема с функцией поиска в реестре.Моя цель - ввести имя ключа и пройти по дереву реестра, пока ключ с этим именем не будет найден.Моя функция может обходить все дерево (сначала в глубину), но проблема в поиске - я могу только успешно искать ключи на «первом уровне».Но если я попытаюсь найти, например, 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);
}
}
//}
//}
}