Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 7
1

Чтение из реестра

06.10.2013, 14:06. Показов 4613. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, я пользуюсь VS 2010 С++. Я пытаюсь считать из реестра некоторые данные. Все бы хорошо но информация о версии BIOS имеет тип данных REG_MULTI_SZ, т.е. несколько строк. У меня в моём коде получается считать и вывести только первую строку, а остальные я не могу вывести. Вся информация выводится в окно EditBox. Собственно часть в которой у меня возникают проблемы это строки с 25 до 32. Там в буфер записывается только первая строка реестра, а остальные куда деваются не знаю. Вот моя процедура:
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
int DataBios(HWND hWnd)
{
    DWORD i;
    wchar_t new_str[3]={0x0d, 0x0a,0};
    wchar_t buf[1000];
    wchar_t str_array[256];
 
    buf[0]=0;
    lstrcat(buf,L"Дата BIOS:");
    lstrcat(buf,new_str);
 
    HKEY  hKeyResult=0;
    DWORD dwType;
    DWORD dwBytes=256;
    wchar_t buf1[500], buf2[256], buf3[256], buf4[256], buf5[256];
    buf1[0]=0; buf2[0]=0; buf3[0]=0; buf4[0]=0; buf5[0]=0;
 
    LONG lResult=RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"HARDWARE\\DESCRIPTION\\System",NULL,KEY_QUERY_VALUE,&hKeyResult);
    lResult=RegQueryValueEx(hKeyResult,L"SystemBiosDate",NULL,&dwType,(LPBYTE)buf1, &dwBytes);
    RegCloseKey(hKeyResult);
    lstrcat(buf,buf1);
    lstrcat(buf,new_str);
    dwBytes=256;
    
    lstrcat(buf,L"Версия BIOS:");
    lstrcat(buf,new_str);
    LONG lResult2=RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"HARDWARE\\DESCRIPTION\\System",NULL,KEY_QUERY_VALUE,&hKeyResult);
    lResult2=RegQueryValueEx(hKeyResult,L"SystemBiosVersion",NULL,&dwType,(LPBYTE)buf2, &dwBytes);
    RegCloseKey(hKeyResult);
    lstrcat(buf,buf2);
    lstrcat(buf,new_str);
    dwBytes=256;
 
    lstrcat(buf,L"Идентификатор процессора:");
    lstrcat(buf,new_str);
    LONG lResult3=RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",NULL,KEY_QUERY_VALUE,&hKeyResult);
    lResult3=RegQueryValueEx(hKeyResult,L"Identifier",NULL,&dwType,(LPBYTE)buf3,&dwBytes);
    RegCloseKey(hKeyResult);
    lstrcat(buf,buf3);
    lstrcat(buf,new_str);
    dwBytes=256;
 
    lstrcat(buf,L"Имя процессора:");
    lstrcat(buf,new_str);
    LONG lResult4=RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",NULL,KEY_QUERY_VALUE, &hKeyResult);
    lResult4=RegQueryValueEx(hKeyResult,L"ProcessorNameString",NULL,&dwType,(LPBYTE)buf4, &dwBytes);
    RegCloseKey(hKeyResult);
    lstrcat(buf,buf4);
 
    SetDlgItemText(hEdit,IDC_EDIT1,buf);
    return 0;
}
Что выводит можно увидеть на скрине.
А должен выводить где написано версия BIOS:
ACRSYS - 1
InsydeH2O Version 03.71.48V1.13
InsydeH2O Version 03.71.48V1.13
InsydeH2O Version 03.71.48V1.13
Миниатюры
Чтение из реестра  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2013, 14:06
Ответы с готовыми решениями:

Чтение ключа из реестра
Здравствуйте. Читает только лишь первый символ ключа из реестра. HKEY rKey; unsigned...

Чтение значений реестра
Есть некий ключ реестра (hkcu\software\rifleproxy), в нем куча строковых параметров, которые нужно...

Чтение ключей реестра, имеющих несколько значений
Какие функции следует использовать для ключей, имеющих только одно значение по умолчанию и для...

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

8
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
06.10.2013, 14:24 2
REG_MULTI_SZ - это набор строк, разделенных нулевым символом.
Вам нужно прочесть значение из реестра в буфер, а затем пройтись по
нему и соединить все строки в одну.
0
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 7
06.10.2013, 15:08  [ТС] 3
Добавлено через 5 минут
Убежденный, а можно как нибудь построчно извлекать из буфера с этими строками и записывать в основной буфер который потом будет выводиться на экран? Если можно то укажите код.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.10.2013, 15:19 4
гугль рулит
reg_multi_sz example
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
06.10.2013, 15:20 5
Читайте строку из начала буфера, пока не будет достигнут нулевой символ.
Достигли нуля - "перепрыгиваем" его и читаем следующую строку.
И так, пока не пройдем весь буфер или пока не встретится двойной нуль.
Каждую найденную строку можно складывать в std::wstring, например.
0
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 7
06.10.2013, 15:44  [ТС] 6
Убежденный, фууух, я мало что понял, и как работать с std::wstring, как я понял это классы, я не умею... Можно примерный код хотя бы. А через функцию GetLine нельзя ни как?
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
06.10.2013, 16:08 7
Создайте указатель и установите его на начало буфера. Он будет указывать на
самую первую строку в буфере. Прочитайте эту строку куда-нибудь, а затем
добавьте к ней символ перевода строки. Ну а дальше смещайте указатель в
буфере вперед, на длину строки + 1 (чтобы учесть завершающий ноль).
Получите указатель на следующую строку. И так далее до конца.

Не знаю, что здесь может быть сложного. Если такие элементарные вещи вызывают
затруднения, может рановато браться за BIOS и характеристики компьютера ?
0
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 7
06.10.2013, 16:14  [ТС] 8
Убежденный, да это не сложно в принципе, просто на VS 2010 он почему то не добавляет к основному буферу буфер с этими данными, а только первую строку. Например в прошлых версиях все работало проще, все строки добавлялись и выводились. Я просто скопировал часть кода из методички и вставил, а он только первую выдает, а на прошлых курсах выдавало как положено... Они использовали более старые VS 6.
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
06.10.2013, 16:25 9
Цитата Сообщение от Alex16 Посмотреть сообщение
Например в прошлых версиях все работало проще, все строки добавлялись и выводились. Я просто скопировал часть кода из методички и вставил, а он только первую выдает, а на прошлых курсах выдавало как положено...
Не могло оно работать как положено.
Потому что REG_MULTI_SZ - это не строка, это набор строк, разделенных нулями.
lstrcat скопирует только первую строку набора, до первого нуля.
0
06.10.2013, 16:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2013, 16:25
Помогаю со студенческими работами здесь

Чтение из реестра
подскажите, пожалуйста, каким образом можно считать из реестра значения. Это смешно, но ВСЕ...

C++ чтение реестра
в общем, пишу функцию для поиска по реестру, но почему-то изначальный путь не тот. Пример: ...

чтение с реестра
Расскажите пожалуйста, как прочитать правильно с реестра строку

Чтение из реестра
Здравствуйте Пытаюсь прочитать данные из реестра. Везде всё хорошо читается и только в одном...


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

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