Форум программистов, компьютерный форум CyberForum.ru

Работа с реестром, взрыв мозга - C++

Восстановить пароль Регистрация
 
 
kpa6uu
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 20
26.11.2014, 17:09     Работа с реестром, взрыв мозга #1
Хех, доброго времени суток тебе, форумчанин. В муках уже второй день, никак не могу решить проблему обнаружения данных в реестре. Что я собственно делаю в коде - ищу папку, в которую установлен Steam, далее проверяю, папка "рабочая", или "мёртвая". Рабочая - та папка, внутри которой располагаются два файла:
Первый - сам Steam.exe
Второй - loginusers.vdf(файл создаётся после каждого захода в Steam, т.е. папка живая)

Мёртвая же папка та, которую удалили по-средствам DEL'ита. Т.е. сама папка осталась, а внутри неё пустота.
Но не суть важно.

В общем - достаю путь до папки из реестра -> проверяю наличие файлов -> если файлов нет, то делаю тоже самое только с другим ключом реестра -> если файлов нет даже во второй найденной папке, то проделываю махинацию третий раз.

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

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
    //#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//
    //#                                                                                                                                #//
    //#                     Начало поиска папки Steam                                                                                  #//
    //#                     Переменная steampath                                                                                       #//
    //#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//
    DWORD BufSize = _MAX_PATH; // Как я понял - буффер
    TCHAR steamfile1[MAX_PATH], steamfile2[MAX_PATH]; // В них храним пути к файлам
    HKEY hKey; // ...
    LSTATUS st; // ...
    TCHAR steampath[MAX_PATH]; // В неё записываем ключ, полученный с реестра(путь к папке)
    TCHAR file1[] = _T("\\Steam.exe"); // Путь к первому файлу относительно "родной" папки Steam
    TCHAR file2[] = _T("\\Config\\loginusers.vdf"); // Путь ко второму файлу. Тоже относительно "родной" папки.
 
    // Начинаю работать с реестром.
    //# Ищу в первом разделе реестра
    st = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
        "SOFTWARE\\Wow6432Node\\Valve\\Steam",
        0,
        KEY_QUERY_VALUE,
        &hKey);
 
    //# Если такой раздел есть
    if (st == ERROR_SUCCESS)
    {
        RegQueryValueEx(hKey, _T("InstallPath"), NULL, NULL, (LPBYTE)steampath, &BufSize); // Записываю полученный ключ в steampath
        RegCloseKey(hKey); // Закрываю ключ
 
        lstrcpy(steamfile1, steampath); // Копирую ключ в заготовленную переменную
        lstrcpy(steamfile2, steampath); // чтобы получить в дальнейшем чистый путь к файлу
        strcat(steamfile1, file1); // steamfile1 - путь к Steam.exe
        strcat(steamfile2, file2); // steamfile2 - путь к Config/loginusers.vdf
 
        std::cout << "steampath 1: " << steampath << "\n"; // Вывожу сообщения для отладки
        std::cout << "Steam.exe: " << steamfile1 << "\n";  // к сожалению не радуют :(
        std::cout << "loginuse.vdf: " << steamfile2 << "\n\n";
    }
 
    // Если файлы не были найдены в папке steampath, то
    // ищем в другом значении реестра другой путь
    if (!FileExists(steamfile1) || !FileExists(steamfile2))
    {
        printf("nety v 1"); // Вывожу сообщение, что в первом ключе реестра файлы найдены не были.
        st = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
            "SOFTWARE\\Valve\\Steam",
            0,
            KEY_QUERY_VALUE,
            &hKey);
        if (st == ERROR_SUCCESS)
        {
            RegQueryValueEx(hKey, _T("InstallPath"), NULL, NULL, (LPBYTE)steampath, &BufSize); // Записываю полученный ключ в steampath
            RegCloseKey(hKey); // Закрываю ключ
 
            lstrcpy(steamfile1, steampath); // Копирую ключ в заготовленную переменную
            lstrcpy(steamfile2, steampath); // чтобы получить в дальнейшем чистый путь к файлу
            strcat(steamfile1, file1); // steamfile1 - путь к Steam.exe
            strcat(steamfile2, file2); // steamfile2 - путь к Config/loginusers.vdf
 
            std::cout << "steampath 2: " << steampath << "\n";
            std::cout << "Steam.exe: " << steamfile1 << "\n";
            std::cout << "loginuse.vdf: " << steamfile2 << "\n\n";
        }
    }
 
    // Если же файлы не были найдены и во втором пути, то
    // начинаю поиск последнего пути по значению реестра
    if (!FileExists(steamfile1) || !FileExists(steamfile2))
    {
        printf("nety v 2");
        st = RegOpenKeyExA(HKEY_CURRENT_USER,
            "Software\\Classes\\steam\\Shell\\Open\\Command",
            0,
            KEY_QUERY_VALUE,
            &hKey);
        if (st == ERROR_SUCCESS)
        {
            RegQueryValueEx(hKey, "assa2", NULL, NULL, (LPBYTE)steampath, &BufSize);
            RegCloseKey(hKey);
 
            lstrcpy(steamfile1, steampath);
            lstrcpy(steamfile2, steampath);
            strcat(steamfile1, file1); // steamfile1 - путь к Steam.exe
            strcat(steamfile2, file2); // steamfile2 - путь к Config/loginusers.vdf
 
            std::cout << "steampath 3: " << steampath << "\n";
            std::cout << "Steam.exe: " << steamfile1 << "\n";
            std::cout << "loginuse.vdf: " << steamfile2 << "\n\n";
        }
    }
 
    //#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//
    //#                                                                                                                                #//
    //#                     Конец поиска папки Steam                                                                                   #//
    //#                     Переменная steampath                                                                                       #//
    //#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//#//
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2014, 17:09     Работа с реестром, взрыв мозга
Посмотрите здесь:

Работа с реестром Виндовс. TRegistry C++
C++ Работа с реестром
Задачка для мозга C++
C++ Работа с реестром.
Работа с Реестром "От основ к вершинам" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kpa6uu
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 20
26.11.2014, 17:23  [ТС]     Работа с реестром, взрыв мозга #2
Вот скрин, описывающий мою проблему...
Миниатюры
Работа с реестром, взрыв мозга  
kpa6uu
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 20
26.11.2014, 19:11  [ТС]     Работа с реестром, взрыв мозга #3
Ребят, ну хоть намёк дайте куда копать. По логике вещей всё должно работать. Почему выводится одно и тоже?
demmax2004
57 / 135 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
26.11.2014, 19:16     Работа с реестром, взрыв мозга #4
А почему не проверяешь правильно ли отработала RegQueryValueEx() ???
kpa6uu
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 20
26.11.2014, 19:30  [ТС]     Работа с реестром, взрыв мозга #5
Проверяю. Создаю новый проект VS, пишу в нём код, удостоверяюсь что он правильно работает и копирую в основной проект.
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
26.11.2014, 19:41     Работа с реестром, взрыв мозга #6
Цитата Сообщение от kpa6uu Посмотреть сообщение
Вот скрин, описывающий мою проблему...
А можно на словах описать проблему, а то непонятно как-то ?..
kpa6uu
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 20
26.11.2014, 19:53  [ТС]     Работа с реестром, взрыв мозга #7
Конечно, постараюсь понятно сформулировать...
У меня есть три пути реестра, из которых нужно получить данные:
1. HKEY_LOCAL_MACHINE, "SOFTWARE\Wow6432Node\Valve\Steam\InstallPath"
2. HKEY_LOCAL_MACHINE, "SOFTWARE\Valve\Steam\InstallPath"
3. HKEY_CURRENT_USER, "Software\Classes\Steam\Shell\Open\Command" (Тут нужно вытянуть значение "По умолчанию")

Они хранят в себе путь к папке, в которую установлен Steam. Мне нужно поочерёдно вытаскивать эти значения и проверять, если ли в указанных папках два нужных файла.
Т.е.:
1. Считал путь к папке
2. Проверил, есть ли в этой папке два нужных файла
3.1. Если есть - сохранить путь к этой папке
3.2. Если нет - проделать с новым путём(вытянутым из следующего значения реестра) операции сначала

Я попытался это сделать (код в головном посте), но у меня почему-то везде значения из первого запроса к реестру, хотя код я несколько десятков раз перепроверил, три раза переписывал.
demmax2004
57 / 135 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
26.11.2014, 19:56     Работа с реестром, взрыв мозга #8
На вид по коду все нормально, если не решишь до завтра проблему, запущу твой код
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
26.11.2014, 19:58     Работа с реестром, взрыв мозга #9
Ну так demmax2004 выше подсказал верный путь решения:
добавьте недостающую проверку ошибок. Для RegQueryValueEx.
Почему-то я уверен, что она возвращает ERROR_MORE_DATA вместо
кода успеха - BufSize-то Вы не обновляете !..
demmax2004
57 / 135 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
26.11.2014, 19:59     Работа с реестром, взрыв мозга #10
Вообще перед каждым вызовом реестра зануляй steampath
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
26.11.2014, 20:00     Работа с реестром, взрыв мозга #11
И еще: "Wow6432Node" не нужно указывать в пути к ветке реестра.
Для этого есть флаги KEY_WOW64_32KEY и KEY_WOW64_64KEY.
kpa6uu
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 20
26.11.2014, 20:19  [ТС]     Работа с реестром, взрыв мозга #12
с Wow6432Node как раз таки и получаю, остальные почему-то молчат...
По вашим наказам изменил
C++
1
RegQueryValueEx(hKey, _T("InstallPath"), NULL, NULL, (LPBYTE)steampath, &BufSize); // Записываю полученный ключ в steampath
на
C++
1
2
3
BufSize = NULL;
RegQueryValueEx(hKey, _T("InstallPath"), NULL, NULL, (LPBYTE)steampath, &BufSize); // Записываю полученный ключ в steampath
std::cout << "buffsize2= " << BufSize << " |||\n";
Эффекта, к сожалению, нет. Вот вывод ком. строки:
Миниатюры
Работа с реестром, взрыв мозга  
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
26.11.2014, 20:38     Работа с реестром, взрыв мозга #13
kpa6uu, почитайте на MSDN описание функции RegQueryValueEx.
Последний параметр - это [in-out]: на входе размер буфера, в байтах, на
выходе - сколько байт было в него записано. У вас на входе 0.
Да, и без проверки того, что именно возвращает функция RegQueryValueEx
дальнейшие разбирательства не имеют смысла.
kpa6uu
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 20
26.11.2014, 21:44  [ТС]     Работа с реестром, взрыв мозга #14
Две 234-тые ошибки.
Тааакс...
234 ошибка это ERROR_MORE_DATA (согласно winerror.pas)
Миниатюры
Работа с реестром, взрыв мозга  
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
26.11.2014, 21:53     Работа с реестром, взрыв мозга #15
О чем и речь.
Схема работы с RegQueryValueEx примерно такая:

1) Выделили буфер (на стеке, через new/malloc или в виде vector<byte> - не суть)
определенного размера, например 100 байт.

2) Установили BufSize = 100.

3) Вызвали функцию RegQueryValueEx. Если успех - она вернет ERROR_SUCCESS и в
BufSize к-во прочитанных байт. Если нет (например, буфер слишком мал) - расширяем
буфер, увеличиваем BufSize и зовем функцию снова. И так далее, пока она не вернет
ERROR_SUCCESS, либо отличный от ERROR_MORE_DATA код.

Да, и еще. Строковые данные, прочитанные из реестра, всегда нужно принудительно
завершать нулем (т.к. строка может храниться в реестре без завершающего нуля).
kpa6uu
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 20
26.11.2014, 22:09  [ТС]     Работа с реестром, взрыв мозга #16
Охо-хо. Спасибо, не можешь помочь с кодом на выделение буфера?
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
26.11.2014, 22:11     Работа с реестром, взрыв мозга #17
1.
C++
1
byte Buffer[Size];
2.
C++
1
2
3
byte * pBuffer = new pBuffer[Size];
// ...
delete [] pBuffer;
3.
C++
1
boost::scoped_array<byte> Buffer(new byte[Size]);
4.
C++
1
std::vector<byte> Buffer(Size);
Сам предпочитаю №4.
kpa6uu
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 20
26.11.2014, 22:35  [ТС]     Работа с реестром, взрыв мозга #18
Взялся за гуж, не говори, что не дюж....
Понимаю, что глупый вопрос, но... как мне использовать это?
Просто поставить перед всем кодом, или использовать отдельно для каждого запроса к реестру?
Если же так, то куда вставлять?
Пойму, если не ответишь
kpa6uu
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 20
26.11.2014, 22:39  [ТС]     Работа с реестром, взрыв мозга #19
Если правильно подставил, то всё равно не выходит, видно нужно на второй заход в гугл.
Миниатюры
Работа с реестром, взрыв мозга  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2014, 00:22     Работа с реестром, взрыв мозга
Еще ссылки по теме:

C++ Работа с реестром
Работа с реестром windows в с++ C++
C++ Отобразить взрыв мины в сапере определенным символом

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

Или воспользуйтесь поиском по форуму:
kpa6uu
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 20
27.11.2014, 00:22  [ТС]     Работа с реестром, взрыв мозга #20
До сих пор тоже самое...
Ээх... Кто заглянет в темку - если уж не готовый ответ на подстановку буфера, так киньте статей обучающих работе с ним, буду весьма благодарен
Yandex
Объявления
27.11.2014, 00:22     Работа с реестром, взрыв мозга
Ответ Создать тему
Опции темы

Текущее время: 04:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru