Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/47: Рейтинг темы: голосов - 47, средняя оценка - 4.62
БНТУ ФИТР
 Аватар для kventin_zhuk
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382

Получить данные из реестра

06.05.2014, 14:08. Показов 10334. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеются данные в реестре в разделе секции автозагрузки. Необходимо получить значение ключей и данных оттуда, не зная самих имен ключей.

На скрине то что содержится в реестре и что получается в листбоксах.
Подкажите в чем проблема
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
            HKEY hKeys;
 
            if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKeys, NULL))
            {
                TCHAR keyName[100];
                TCHAR data[512];
                DWORD dataSize;
                DWORD size;
 
                SendDlgItemMessage(hWnd, IDC_LIST1, LB_RESETCONTENT, 0, 0);
                SendDlgItemMessage(hWnd, IDC_LIST2, LB_RESETCONTENT, 0, 0);
 
                LSTATUS err = 0;
                int i = 0;
    
                while (RegEnumValue(hKeys, (int)i, keyName, &size, NULL, NULL, NULL, NULL) != ERROR_NO_MORE_ITEMS)
                {
                    ;
                    RegGetValue(hKeys, NULL, keyName, REG_MULTI_SZ, 0, &data, &dataSize);
                    SendDlgItemMessage(hWnd, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)keyName);
                    SendDlgItemMessage(hWnd, IDC_LIST2, LB_ADDSTRING, 0, (LPARAM)data);
                    i++;
                    //LONG val = RegGetValue(hKeys, NULL, i, REG_MULTI_SZ, 0, &out, &size);
                }
 
                RegCloseKey(hKeys);
            }
Миниатюры
Получить данные из реестра   Получить данные из реестра  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.05.2014, 14:08
Ответы с готовыми решениями:

Как вызвать функцию RegGetKeySecurity чтобы получить данные о security descriptor раздела реестра?
Друзья! Это всё связано с правами на раздел реестра и его владельцами и всем таким прочим. Есть раздел...

Получить данные из реестра
Всем привет! Скажите пожалуйста, что я делаю не так RegistryKey key = Registry.LocalMachine; key =...

Получить Бинарные данные с реестра wmi
const long HKLM = 0x80000002;//HKEY_LOCAL_MACHINE String strKey = @"Software\Microsoft\Windows\CurrentVersion\Uninstall"; ...

12
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
06.05.2014, 20:32
1) В RegCreateKeyEx зачем-то передается KEY_ALL_ACCESS, хотя требуется
лишь доступ на чтение. Это приведет к тому, что если программа запущена
от обычного пользователя (не администратор, т.н. standard user), функция
вернет ошибку из-за недостатка прав (access denied). Если использовать
KEY_READ, такого бы не случилось.

2) Обратите внимание: RegGetValue не только читает последний аргумент
(pcbSize), но и пишет в него к-во прочитанных байт. У Вас при каждом
следующем вызове это значение не обновлятется.

3) RegGetValue отсутствует на старой доброй Windows XP.
Если требуется совместимость, используйте RegQueryValueEx.

4) Код вида
C
1
while (RegEnumValue(...) != ERROR_NO_MORE_ITEMS)
- опасная самонадеянность. Лучше проверять, что функция действительно
вернула ERROR_SUCCESS, и только в этом случае посылать строку в
list box. И вообще, в хорошем коде следует проверять возвращаемые
значения всех, абсолютно всех функций. А не только там, где хочется.
1
БНТУ ФИТР
 Аватар для kventin_zhuk
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
06.05.2014, 20:53  [ТС]
Убежденный, Спасибо - учел. Но вот что мне никак не дает покоя - у меня считываются не все значения. В редакторе реестра больше. В другой части программы я добавляю и удаляю программу в автозагрузку(успешно добавляется и прописывается в реестре). При этом - этот этот участок кода видит эту запись. Но если я руками( в regedit) добавляю в эту ветку запись такого типа( допустим Name - Hello, Data - world). Программа в упор её не видит.

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
            if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_READ, &hKeys))
            {
 
                TCHAR keyName[100];
                TCHAR data[1000];
                DWORD dataSize;
                DWORD size = 512;
 
                SendDlgItemMessage(hWnd, IDC_LIST1, LB_RESETCONTENT, 0, 0);
                SendDlgItemMessage(hWnd, IDC_LIST2, LB_RESETCONTENT, 0, 0);
 
                LSTATUS err = 0;
                int i = 0;
 
                while (err == ERROR_SUCCESS)
                {
                    err = RegEnumValue(hKeys, (int)i, keyName, &size, NULL, NULL, NULL, NULL);
                    if (err == ERROR_SUCCESS)
                    {
                        LSTATUS err2 = RegGetValue(hKeys, NULL, keyName, REG_MULTI_SZ, 0, &data, &dataSize);
 
                        if (err2 == ERROR_SUCCESS)
                        {
                            SendDlgItemMessage(hWnd, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)keyName);
                            SendDlgItemMessage(hWnd, IDC_LIST2, LB_ADDSTRING, 0, (LPARAM)data);
                        }
                    }
                    i++;
 
                }
 
                RegCloseKey(hKeys);
            }
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
06.05.2014, 22:19
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
Но вот что мне никак не дает покоя - у меня считываются не все значения.
Уже написал выше почему, см. пункт 2.
Запустите программу под отладчиком и посмотрите, как меняется
значение DataSize сразу после вызова RegGetValue. А ведь в DataSize
передается размер буфера для вызова следующей RegGetValue...
Думаю, намек понятен.

Цитата Сообщение от kventin_zhuk Посмотреть сообщение
В другой части программы я добавляю и удаляю программу в автозагрузку(успешно добавляется и прописывается в реестре). При этом - этот этот участок кода видит эту запись. Но если я руками( в regedit) добавляю в эту ветку запись такого типа( допустим Name - Hello, Data - world). Программа в упор её не видит.
Что, программа прямо так и пишет: "не вижу" ?


Дайте техническое описание проблемы.
Например, "вызов RegGetValue возвращает ERROR_FILE_NOT_FOUND".

Кстати, еще парочка моментов.

1) Посмотрите в описании RegGetValue, какие флаги принимает функция.
Они все начинаются с RRF_RT. REG_MULTI_SZ среди них нету.
Кстати, строковые параметры - это REG_SZ и REG_EXPAND_SZ, а
REG_MULTI_SZ - это массив строк, разделенных нулем.

2) DataSize у Вас вообще не проинициализирован.
При запуске в Debug-конфигурации разве программа не выбрасывает
исключение типа "uninitialized variable used" ?

3) Проблемы с "видимостью" данных могут возникнуть на 64-битных Windows,
там для некоторых ключей реестра заведены две ветки, одна для x86,
вторая для x64. Например, HKLM\SOFTWARE и HKLM\SOFTWARE\Wow6432Node.

Типичная ситуация: ваша программа (32-битная) записывает что-то в реестр,
затем вы запускаете regedit (который 64-битный), заходите в нужный
раздел, а там пусто.

Добавлено через 15 минут
И еще, пока не забыл.
Строковые данные в реестре могут не заканчиваться
завершающим нулем, в MSDN об этом сказано.
Для надежности вы всегда должны этот ноль проверять и добавлять сами.
1
БНТУ ФИТР
 Аватар для kventin_zhuk
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
06.05.2014, 23:55  [ТС]
Убежденный, Про DataSize понял получается нужно после каждого вызова возвращать размер буффера к исходному.

Я открываю просматриваю содержимое нужной мне ветви с помощью Regedit. Вижу что у меня там записи о двух программах - отлично. Запускаю программу - считал данные из этой ветви. После добавил через regedit новую запись в эту ветвь допустим Name - MyProg, Data - <путь к программе>. В Regedit отобразилась запись в соответствующей ветви. Но в программе RegEnumValue не находит нужный добавленной записи в ветвь.

Ту же самую процедуру произвожу с помощью программного кода:

C++
1
2
3
4
5
if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKeys, NULL))
            {
                RegSetValueEx(hKeys, L"MyProg", 0, REG_SZ, reinterpret_cast<const BYTE*>(&autorun), size);
                RegCloseKey(hKeys);
            }
Запись прописывается в ветви реестра, видна в regedit, и главное. Код ранее( выводящий в два листбокса записи ветви реестра) прекрасно видит эту запись в ветви.

Вот это и проблема(
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
07.05.2014, 19:08
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
Вот это и проблема(
Написал выше возможную причину. Windows какая ? 64 бита или 32 ?
0
БНТУ ФИТР
 Аватар для kventin_zhuk
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
07.05.2014, 21:33  [ТС]
Убежденный, 64 ось ... Запускал сегодня на 7-ке 64 битной. Не вывело одну запись.
0
БНТУ ФИТР
 Аватар для kventin_zhuk
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
08.05.2014, 15:03  [ТС]
Убежденный, Спецом запустил на еще одной машине на ней результат совсем печальный ... (код выше)
Миниатюры
Получить данные из реестра   Получить данные из реестра  
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.05.2014, 22:03
kventin_zhuk, покажите полный код.
0
БНТУ ФИТР
 Аватар для kventin_zhuk
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
09.05.2014, 22:29  [ТС]
Убежденный, Там ресурсы, так что один код будет неудобно. Вот весь проект. Суть такая - выводить список записей из ветки реестра и добавлять/ удвлять программу в автозагрузку.
Вложения
Тип файла: rar Reg.rar (1.81 Мб, 88 просмотров)
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.05.2014, 23:05
Лучший ответ Сообщение было отмечено kventin_zhuk как решение

Решение

kventin_zhuk, посмотрел.

Мое резюме: код выбросить. Затем открыть в MSDN справку по функциям
работы с реестром типа RegEnumValue и RegGetValue и внимательно-внимательно
прочесть описание, и по каждому параметру тоже. Понять, где передается
количество символов, а где байт, где есть завершающий ноль, а где его
может не быть, где параметр входной, а где выходной, и так далее. Это первое.

Второе. Забыть навсегда про статические массивы фиксированного размера
типа "TCHAR data[1000]". Так пишут только зеленые юнцы, которые не думают о
том, что стек не резиновый и что рано или поздно данных окажется больше,
чем 1000 TCHAR-ов. Откройте для себя std:: (w)string или хотя бы динамические
массивы. Или смартпоинтеры (типа boost::scoped_array).

Третье. Это лично мое мнение, но от char/TCHAR лучше избавляться.
Используйте Юникод в явном виде - main/WinMain вместо _tmain, wchar_t
вместо char, MessageBoxW, std::wstring, WIN32_FIND_DATAW и т.д.
На дворе двадцать первый век, всякие CP866 давно устарели и никому
уже не нужны. TCHAR вообще опасен, потому что тот, кто читает ваш код, - а
это можете быть вы сами, например спустя пару месяцев, - не видит, какой
именно тип, - char или wchar_t, - используется в текущей конфигурации
проекта и в итоге легко может напортачить. Некоторые Win32-функции ведут
себя по-разному, в зависимости от строкового типа (например, CreateProcess).
В cout/wcout тоже можно по ошибке передать "не тот" TCHAR, в результате
вместо символов увидим кракозябры. И будет постоянная путаница, связанная с
тем, что "sizeof (char) == 1", а "sizeof (wchar_t) == 2".
1
БНТУ ФИТР
 Аватар для kventin_zhuk
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
10.05.2014, 01:34  [ТС]
Убежденный, Да уж .... лоханулся так лоханулся

Cпасибо вам, разобрался)
0
0 / 0 / 0
Регистрация: 23.01.2020
Сообщений: 3
27.01.2020, 03:46
kventin_zhuk, можеш помочь с проектом, мне нужно получить список установленных программ и вывести их на форму!????
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.01.2020, 03:46
Помогаю со студенческими работами здесь

Получить данные об установленных программах из удалённого реестра
возможно ли в PowerShel подключиться к удаленному реестру(сетевой реестр) и вытащить данные по установленному софту с этого реестра? ...

Как в VBA записать данные в реестр и читать данные из реестра?
Как в VBA записать данные в реестр и читать данные из реестра office xp

Данные реестра не сохраняются
Добрый день. Возникла следующая проблема. Есть графический планшет Wacom. По умолчанию в win7 включена такая функция как Pen...

Как прочитать данные из реестра
как прочитать данные из реестра и по нажатию баттона записать в текстбокс?

Как из VB читать данные с реестра?
Kak iz VB mozhno chitat` dannye is reestra??? Esli mozhno, to dajte primer, a to vchera 3 chasa v i-net'e sidel, da tak normal`nogo...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3, Box2D, FreeType и SDL3_ttf из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru