Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
26 / 21 / 11
Регистрация: 26.10.2013
Сообщений: 108
1

Рекурсивное перечисление подключей реестра и их использование

17.06.2014, 07:38. Показов 1335. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе время суток!

Подскажите, пожалуйста, как можно заменить функции sprintf и printf в коде? Дело в том, что при закрытии формы появляется сообщение о том, что "Прекращена работа...", и выскакивает ошибка "Abnormal program termination". И покажите, если не сложно, как можно, например, записать значение типа REG_SZ "Test" в каждый найденный таким способом подключ?

Заранее спасибо!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
void EnumerateSubKeys(HKEY RootKey, char* subKey, unsigned int tabs = 0)
{
 HKEY hKey;
    DWORD cSubKeys;        //Used to store the number of Subkeys
    DWORD maxSubkeyLen;    //Longest Subkey name length
    DWORD cValues;        //Used to store the number of Subkeys
    DWORD maxValueLen;    //Longest Subkey name length
    DWORD retCode;        //Return values of calls
 
 RegOpenKeyEx(RootKey, subKey, 0, KEY_ALL_ACCESS, &hKey);
 
    RegQueryInfoKey(hKey,            // key handle
                    NULL,            // buffer for class name
                    NULL,            // size of class string
                    NULL,            // reserved
                    &cSubKeys,        // number of subkeys
                    &maxSubkeyLen,    // longest subkey length
                    NULL,            // longest class string
                    &cValues,        // number of values for this key
                    &maxValueLen,    // longest value name
                    NULL,            // longest value data
                    NULL,            // security descriptor
                    NULL);            // last write time
 
    if(cSubKeys>0)
 {
        char currentSubkey[MAX_PATH];
 
        for(int i=0;i < cSubKeys;i++){
   DWORD currentSubLen=MAX_PATH;
 
            retCode=RegEnumKeyEx(hKey,    // Handle to an open/predefined key
            i,                // Index of the subkey to retrieve.
            currentSubkey,            // buffer to receives the name of the subkey
            &currentSubLen,            // size of that buffer
            NULL,                // Reserved
            NULL,                // buffer for class string
            NULL,                // size of that buffer
            NULL);                // last write time
 
            if(retCode==ERROR_SUCCESS)
   {
                for (int i = 0; i < tabs; i++)
                    printf("\t");
                printf("(%d) %s\n", i+1, currentSubkey);
 
                char* subKeyPath = new char[currentSubLen + strlen(subKey)];
                sprintf(subKeyPath, "%s\\%s", subKey, currentSubkey);
    EnumerateSubKeys(RootKey, subKeyPath, (tabs + 1));
   }
  }
 }
 
 
 RegCloseKey(hKey);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
EnumerateSubKeys(HKEY_CURRENT_USER,"SOFTWARE\\TestDir");
}
//---------------------------------------------------------------------------
Добавлено через 8 часов 42 минуты
Разобрался с записью значений: нужно передавать переменные RootKey и subKeyPath в качестве параметров корневой ветки (HKEY_CURRENT_USER) и его подключей соответственно. Остаётся только вопрос о замене функций...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.06.2014, 07:38
Ответы с готовыми решениями:

Вывод подключей реестра
Здравствуйте, как в С++ на форме можно вывести подключи какогото ключа реестра? например вводим в...

Перечисление параметров реестра
Добрый вечер. Что-то не могу понять, почему у меня не работает код. Есть у меня функция, в которой...

Рекурсивное удаление раздела реестра
Здравствуйте! Ребят можете подсказать, что я делаю не так. блин, голову сломал :wall:...

Использование реестра
Хочу сохранить положение окна формы, чтобы при следующем запуске окошко было на том же месте. В...

6
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
17.06.2014, 07:46 2
Заменить char* на std::string, sprintf на +
1
26 / 21 / 11
Регистрация: 26.10.2013
Сообщений: 108
17.06.2014, 12:22  [ТС] 3
uglyPinokkio, спасибо большое!) Можно только чуть-чуть поподробнее? Дело в том, что я уже пытался преобразовать всё в строки String, а затем сложить их. Только никак не получается... Тут ведь не простое сложение заранее известных строк. Никогда не сталкивался с этим раньше.
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
17.06.2014, 12:29 4
Лучший ответ Сообщение было отмечено Bruce_Wayne как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
#include <string>
#include <iostream>
int main()
{
   char* a="char string a";
   char* b="char string b";
   std::string a_string = a;
   std::string b_string = b;
   std::string sum_string = a_string+"+"+b_string;
   std::cout<<sum_string;
}
Перед присвоением указателя строке обязательно проверять на 0.
1
26 / 21 / 11
Регистрация: 26.10.2013
Сообщений: 108
17.06.2014, 18:16  [ТС] 5
uglyPinokkio, спасибо!) Всё получилось! Заменил строчку:
C++
1
sprintf(subKeyPath, "%s\\%s", subKey, currentSubkey);
На:
C++
1
2
3
4
5
6
std::string a_string = subKey;
std::string b_string = currentSubkey;
std::string sum_string = a_string+"\\"+b_string;
// Перевод char* в std::string и сложение к виду подключей;
subKeyPath = strdup(sum_string.c_str());
// Перевод const char* (sum_string.c_str()) в char* и копирование этой переменной в переменную subKeyPath;
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
17.06.2014, 18:26 6
Лучший ответ Сообщение было отмечено Bruce_Wayne как решение

Решение

Цитата Сообщение от Bruce_Wayne Посмотреть сообщение
Всё получилось!
Не, работать то оно наверное работает, но вот в этом месте:

C++
1
char* subKeyPath = new char[currentSubLen + strlen(subKey)];
Память на каждой итерации выделяется, а освобождения я не вижу.
Я то имел в виду что-то типа:

C++
1
2
3
4
5
6
7
8
void EnumerateSubKeys(HKEY RootKey, std::string subKey, unsigned int tabs)
{
   ....
   RegOpenKeyEx(RootKey, subKey.c_str(), 0, KEY_ALL_ACCESS, &hKey);
   ...
   std::string sum_string = subKey+"\\"+b_string;
   EnumerateSubKeys(RootKey, sum_string, (tabs + 1));
}
1
26 / 21 / 11
Регистрация: 26.10.2013
Сообщений: 108
17.06.2014, 19:38  [ТС] 7
Благодарю!)
0
17.06.2014, 19:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2014, 19:38
Помогаю со студенческими работами здесь

Использование реестра или чтото другое...???
Здравствуйте! Вот задался на днях вот таким вот вопросом! Есть у меня программа которая...

Список подключей
Надо получить список подключей заданного ключа и вывести все это в Memo. Пробовал так:...

Использование браузера по умолчанию и данных о файле в командах реестра
Собственно 2 вопроса : 1) В команде можно написать &quot;firefox.exe http://ya.ru/&quot;, тогда при вызове...

Исследование, использование реестра для передачи информации между приложениями
Добрый день-вечер, дорогие друзья форумчане! Может кто реализовывал подобное или знает, где...

Рекурсивное и не рекурсивное вычисление НОД
Здравствуйте! Имеется код вычисления НОД. Как сделать его рекурсивным и НЕ рекурсивным, и в чём...

Сбор подключей заданого ключа в системном реестре
Всем привет! Немогу понять, почему не работает корректно. Мне надо в системной реестре выбрать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru