Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/10: Рейтинг темы: голосов - 10, средняя оценка - 4.70
omezik
2 / 2 / 0
Регистрация: 30.06.2009
Сообщений: 125
1

Считывание бинарных значений из реестра и запись их в одну строку

10.07.2009, 13:20. Просмотров 1783. Ответов 12
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//9.Функция для считывание бинарных значений из реестра и передачи значения в виде одной строки через пробел (передать переменные с путем и параметром реестра)
AnsiString reg_reading_bin(AnsiString root, AnsiString dur, AnsiString name)
{ TRegistry *reg = new TRegistry(KEY_ALL_ACCESS);
reg->RootKey = GetPViodFromStrKey(root);
reg->OpenKey(dur.c_str(), true);
if (reg->ValueExists(name))
{
AnsiString znachenie;
char buff[64];
char array[4];
reg->ReadBinaryData(name, &array,sizeof(BYTE));
sprintf (buff, "0x%02x 0x%02x 0x%02x 0x%02x", (unsigned char)array[0], (unsigned char)array[1], (unsigned char)array[2], (unsigned char)array[3]);
znachenie = printf("buff = %s\n", buff);
return (znachenie);}
 }
Вот функция при запуске вылетает ошибка
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class ERegistryException with message 'Invalid data type for 'CacheSize''. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

что зделал не правильно

Вызываю вот так


C++
1
2
3
4
5
6
AnsiString a25 = "HKEY_LOCAL_MACHINE";
AnsiString b25 = "SYSTEM\\CurrentControlSet\\Control\\FileSystem\\CDFS";
AnsiString c25 = "CacheSize";
AnsiString t25;
t25 = reg_reading_bin (a25,b25,c25);
ShowMessage (t25);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2009, 13:20
Ответы с готовыми решениями:

Чтение из реестра бинарных данных в HEX виде.
Вообщем такое дело, есть в реестре ключ типа REG_BINARY, в нем записаны...

Считывание DWORD с реестра
Доброго дня..Прошу подсказать где моя ошибка... TRegistry *reg=new...

Считывание значения параметра из реестра
Здравствуйте!!!! Подскажите, по такому вопросу, пытаюсь считать значение...

Быстрый перевод значений цветов пикселей изображения в двоичную систему счисления и запись их в строку
Здравствуйте. Имеется изображение формата bmp. Для получения цветов пикселей...

Считывание из реестра параметра с обратными слэшами
Имеется код для считывания настроек из реестра. После открытия раздела реестра...

12
Evg
Эксперт CАвтор FAQ
19288 / 7147 / 528
Регистрация: 30.03.2009
Сообщений: 19,997
Записей в блоге: 30
10.07.2009, 13:40 2
Когда пишешь код - потрать 5 минут и аккуратно его отформатируй. Ну невозможно в такой помойке ковыряться.

Что в твоём понимании делает код "znachenie = printf("buff = %s\n", buff);"?
И что в твоём понимании делает printf? Просто прежде чем лезть писатьпрограмму ты не считаешь нужным хотя бы разобраться в том, а что же ты делаешь?
1
omezik
2 / 2 / 0
Регистрация: 30.06.2009
Сообщений: 125
10.07.2009, 14:04  [ТС] 3
printf сщитает кол-во строк ну все же где сама строка откуда ее взять
да я знаю что программист из меня не какой но я все таки пытаюся я же не виноват что меня так обучали в свое время, приходится задовать глупые вопросы и делать кучу ошибок а как я иначе получу нужный мне результат я программированием занимаюсь только ради интереса а не ради выгоды и тому подобное!!!
0
Gravity
569 / 563 / 64
Регистрация: 29.01.2009
Сообщений: 1,274
10.07.2009, 14:07 4
Цитата Сообщение от omezik Посмотреть сообщение
printf сщитает кол-во строк ну все же где сама строка откуда ее взять
Вобще-то, она возвращает количество записанных символов в поток.
0
Evg
Эксперт CАвтор FAQ
19288 / 7147 / 528
Регистрация: 30.03.2009
Сообщений: 19,997
Записей в блоге: 30
10.07.2009, 14:07 5
printf ПЕЧАТАЕТ строку (в консольном приложении) и уэ точно количество строк не считает (а возвращает количество напечатанных БУКВ). Ты хоть объясни, что твоя функция должна делать. Если вернуть отформатированную строку, то вместо 13 и 14 строк надо писать "return buff;". При этом у тебя есть вторая ветка исполнения, в которую мы попадаем, если условие в if'е на 6-й строке ложно. В этом случае процедура вообще возвращает мусор, при дальнейшем использовании которого почти наверняка программа раком встанет
1
omezik
2 / 2 / 0
Регистрация: 30.06.2009
Сообщений: 125
10.07.2009, 14:14  [ТС] 6
C++
1
2
3
4
5
6
7
char buff[4];
char array[4];
reg->ReadBinaryData(name, &array,sizeof(array));
sprintf (buff, "0x%02x 0x%02x 0x%02x 0x%02x", (unsigned char)array[0],
 (unsigned char)array[1], (unsigned char)array[2], (unsigned char)array[3]);
printf("buff = %s\n", buff);
return (buff);
А так тоже ругается на 4 строку
0
Evg
Эксперт CАвтор FAQ
19288 / 7147 / 528
Регистрация: 30.03.2009
Сообщений: 19,997
Записей в блоге: 30
10.07.2009, 14:17 7
Покажи всю процедуру целиком и текст ругани. И убери ты строку с printf'ом, я её тебе написал чисто для того, чтобы ты мог посмотреть, что там напечатается. Я не знал, что ты настолько не разбираешься

Добавлено через 33 секунды
и почему в buff только 4 байта?
0
omezik
2 / 2 / 0
Регистрация: 30.06.2009
Сообщений: 125
10.07.2009, 14:18  [ТС] 8
С 6 строкой продумано все я просто не пишу ни чего сдесь как и ты говорил лишнее убираю ЧТО БЫ ГЛАЗА НЕ МОЗОЛИТЬ
0
Evg
Эксперт CАвтор FAQ
19288 / 7147 / 528
Регистрация: 30.03.2009
Сообщений: 19,997
Записей в блоге: 30
10.07.2009, 14:20 9
Ну тогда покажи, как ругается. Почему всё из тебя клещами надо вытаскивать?
0
omezik
2 / 2 / 0
Регистрация: 30.06.2009
Сообщений: 125
10.07.2009, 14:25  [ТС] 10
спасибо все получилось я помню что printf выводит сообщение по паскалю и php , просто подумал может в плюсах он другую функцию выполняет !!!

Добавлено через 3 минуты 19 секунд
А допустим массив будет состоять не из 4 а из 100 строк что тогда опять ошибка на ошибке

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
AnsiString reg_reading_bin(AnsiString root, AnsiString dur, AnsiString name)
{ TRegistry *reg = new TRegistry(KEY_ALL_ACCESS);
// выбираем нужный корень
reg->RootKey = GetPViodFromStrKey(root);
// открываем секцию
reg->OpenKey(dur.c_str(), true);
// Если ветка существует, то
if (reg->ValueExists(name))
{
//BYTE binarydat[4];
//reg->ReadBinaryData(name, &binarydat,sizeof(BYTE));
//BYTE array[4];
char buff[64];
char array[4];
reg->ReadBinaryData(name, &array,sizeof(array));
sprintf (buff, "0x%02x 0x%02x 0x%02x 0x%02x", (unsigned char)array[0], (unsigned char)array[1], (unsigned char)array[2], (unsigned char)array[3]);
// закрываем секцию
//reg->CloseKey();
//Возвращаем значение функций
return (buff);}
else {
AnsiString znachenie = "0";
return (znachenie);
 }
 }
Вот что получилось
0
Evg
Эксперт CАвтор FAQ
19288 / 7147 / 528
Регистрация: 30.03.2009
Сообщений: 19,997
Записей в блоге: 30
10.07.2009, 14:33 11
А я тебе сразу писал, что код, который я тебе сделал - он "тупой" ибо заточен на кокнкретную реализацию из 4 чисел, разделённых одним пробелом
0
omezik
2 / 2 / 0
Регистрация: 30.06.2009
Сообщений: 125
10.07.2009, 15:04  [ТС] 12
C++
1
char array[4];
хотел за место этой строчки всавить следующую
C++
1
char* array=new BYTE[4];
выдает ошибку при запуске программы
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00402AFB in module 'Project1.exe'. Read of address 00000202'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

Добавлено через 13 минут 8 секунд
В данный момент хотя бы сделать так что бы в функцию можно было передать переменую например значение ее 4 и вставить в массив

C++
1
2
int i = 4;
char array[i];
раньше в других функциях я делал вот так все работало
C++
1
2
int i = 4;
char* array=new BYTE[i];
а в этой функций почему то не хочет

Добавлено через 8 минут 19 секунд
Моя задумка такова делаем небольшое редактирование кода
C++
1
2
3
4
sprintf (buff, "0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x",
 (unsigned char)array[0], (unsigned char)array[1],(unsigned char)array[2], (unsigned char)array[3],
unsigned char)array[4], (unsigned char)array[5],(unsigned char)array[6], (unsigned char)array[7],
unsigned char)array[8], (unsigned char)array[9],(unsigned char)array[10], (unsigned char)array[11]);
имеем уже возможность чтения с массивом до 12 строк если строк тока 4 остальным 8-ми присваиваются 0х00 отчитываем первые 4 числа а после все удаляем и потом можно все это присвойть строку и отправить туда от куда функция вызывалась
0
Evg
Эксперт CАвтор FAQ
19288 / 7147 / 528
Регистрация: 30.03.2009
Сообщений: 19,997
Записей в блоге: 30
10.07.2009, 15:12 13
Если ты что-то пытался у меня спросить, то я вообще ничего не понял. Не понял даже в чём вопрос
0
10.07.2009, 15:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2009, 15:12

Правка реестра в наладоннике (Запись, считывание ключей)
нужно править реестр под наладонник, обычные методы не подходят, посоветуйте...

Запись нескольких слов в одну строку
Подскажите, пожалуйста, как записать несколько слов в одну строку....мне...

Запись в файл. Все в одну строку
Вот код: void CreateDictionary(char *file_name) { ofstream...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru