Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Реестр и двоичные данные
Форум программистов > Системное программирование > C, С++ и С Builder > Borland C++ Builder & Kylix
IIaBeJl
Подскажите плиз... У меня есть двоичная запись в реестре, мне надо её просто выгрузить в текстовом виде и загрузить в реестр в другой ключ... Вот и всё! Выгружать можно в файл в любом формате, хоть просто код бинарный, хоть в спец файл .reg... Не имеет разницы, главное чтобы потом опять в реестр идентичную копию этих данных записать... Главное чтобы данные были двоичными в реестре и имели соответствующий формат...
etc
И чем же помочь? Ну вот есть такой тип TRegistry для работы с реестром.
IIaBeJl
на всех форумах мне так отвечали, но когда я начинаю им подробнее объяснять что он не пашет все сразу молчат как рыбы... и затихают как-будто все ламеры такие же как и я...
Вот один из способов как я пытался делать: у меня есть файл .reg, он создавался с помощью функции экспорта в regedit(не через командную строку!!! а через спец контекстное меню, потому что эти 2 вида создания создают файлы .reg с разным синтаксисом), в нём добавление соответствующих данных, но мне надо не через этот файл добавить а программно... вот как выглядят двоичные данные в файле .reg:
hex:10,00,00,0c,6b,00,69,00,6c,00,6c,00,65,00,72,00,30,00,01,00,98,47,fc,\
  7e,0f,89,1d,fd,5d,02,f1,9d,58,7d,8f,77,ae,c0,b9,80,d4,30,4b,01,13,b4,06,f2

ну там конечно же больше, я просто сократил... мне надо их внести в реестр через REG_BINARY.
Я вносил так:
RegSetValueEx(hKey, "1", 0, REG_BINARY, "hex:10,00,00,0c,6b,00,69,00,6c,00,6c,00,65,00,72,00,30,00,01,00,98,47,fc,\
  7e,0f,89,1d,fd,5d,02,f1,9d,58,7d,8f,77,ae,c0,b9,80,d4,30,4b,01,13,b4,06,f2", 500);

Они вносятся, но не так как надо, потому что я сравнивал вношение через .reg и через этот синтаксис и данные отличались...
Мне надо чтобы они вносились такими же как и вот в этом примере(короче просто должны убраться слово hex, ":" и ",".) а они видно как-то преобразуются перед вношением в реестр и получается другая строка в реестре:
 68 65 78 3a 31 30 2c 30 30 2c 30 63 2c

... ну и так далее... мне короче надо чтобы они не преобразовывались так.Вот что должно получиться после вношения данных в реестр:
"1"=10 00 00 0c 6b 00 69 00 6c 00 6c 00 65 00 72 00 30 00 01 01 98 47 fc
etc
Что-то не понял, а зачем вам файл? вы собираетесь данные нести на другую машину?

Цитата(IIaBeJl @ 11:07:2008 - 14:35) *
им подробнее объяснять что он не пашет
а что значит не пашет?


Цитата(IIaBeJl @ 11:07:2008 - 14:35) *
Я вносил так:
Этот файл предназначен для импорта через редактор, для програмы он в таком виде конечно же не подойдет.
IIaBeJl
Цитата(etc @ 11:07:2008 - 15:37) *
Что-то не понял, а зачем вам файл?


я же говорю, если у вас есть другой вариант тоговорите... мне действительно надо на другую машину скопировать данные из реестра поэтому надо куда-то предварительно сохранить свои данные...


Цитата(etc @ 11:07:2008 - 15:37) *
а что значит не пашет?


ну тот способ который я привёл не работает...
Цитата(etc @ 11:07:2008 - 15:37) *
Этот файл предназначен для импорта через редактор, для програмы он в таком виде конечно же не подойдет.


Ладно, забьём на этот способ... Есть другой? Скажите как и желательно с примером...
etc
Ну так яж сказал вам, читаете и пишете по средствам TRegistry, у него есть спец. методы для этого ReadBinaryData и WriteBinaryData.
Считываете (ReadBinaryData) ваши ключи, сохраняете в файл или еще куда, и пишете потом их (WriteBinaryData). Вся премудрость.
Если хотите из этого файла то позаботится надо о преобразовании той хитрой строки в бинарное представление.

ps: думаю вы догадались что там 16-ричный формат? wink.gif
IIaBeJl
Цитата(etc @ 11:07:2008 - 16:00) *
ps: думаю вы догадались что там 16-ричный формат?


ну там для идиотов написано hex: biggrin.gif
Цитата(etc @ 11:07:2008 - 16:00) *
Считываете (ReadBinaryData) ваши ключи

Вот это не получается...(((( Вот что пишу:

Reg->RootKey = HKEY_LOCAL_MACHINE;
Reg->OpenKey("\\Software\\xxxx\\xx",true);
Reg->OpenKey("\\SOFTWARE\\xxxx\\xx\\1",true);//в открытом ключе 1 находится одна запись с именем "1".
DWord binarydat;
Reg->ReadBinaryData('1', &binarydat, sizeof(DWord));//считываю значение(на сколько я понимаю...) "1" в переменную binarydat


Вот после этой записи binarydat при запуске программы получаю - ...ERegistryException ... 'Invalid data type for '1"
etc
Цитата(IIaBeJl @ 13:07:2008 - 20:26) *
DWord binarydat;
А почему вы решили именно таким типом читать?
IIaBeJl
Цитата(etc @ 14:07:2008, 07:18 ) *
А почему вы решили именно таким типом читать?


Та я не только таким типом пытался читать... пытался и char-ом читать... тоже самое получил... просто искал в гугле ткое и было написано что вот таким типом прочитать можно...
etc
А каким туда записывали?
IIaBeJl
Цитата(etc @ 14:07:2008, 15:00 ) *
А каким туда записывали?


данные в реестр записывала программа, вид данных я вам написал... зачем мне ща думать про записывание данных если я их ещё даже не считал... вы мне подскажите как их считать? а то ошибки только выскакивают при моём синтаксисе
zubr
IIaBeJl
В ключе, который ты собираешься прочитать 50 байт, а ты создаешь буфер размером 4 байта. Создай в качестве буфера массив байт соответствующей длины.
IIaBeJl
Уууу, я же совсем забыл... я ещё в файл данные реестра должен записать, а потом их из файла в реестр засунуть...
Вот как я делал и у меня данные в исходной записи отличались от полученной записи:
Сперва вот так вот записывал:
Reg->RootKey = HKEY_LOCAL_MACHINE;
FILE *stream;
stream = fopen("c:\\my.file", "w+");
char datalen[3000];
Reg->OpenKey("\\SOFTWARE\\xxxx\\xx\\1",true);
Reg->ReadBinaryData("1",&datalen,sizeof(datalen));
fwrite(datalen, strlen(datalen)+1, sizeof(datalen), stream);
fclose(stream);


затем так считывал:
stream = fopen("c:\\my.file", "r+");
char datalen[3000];
fread(datalen, strlen(datalen)+1, 3000, stream);
Reg->OpenKey("\\Software\\xxxx\\xx",true);
Reg->CreateKey("2");
Reg->OpenKey("\\SOFTWARE\\xxxx\\xx\\2",true);
Reg->WriteBinaryData("1", datalen, sizeof(datalen));
fclose(stream);
IIaBeJl
Я тут кое-что переделал, но всё равно надо в файл добавить значения и извлечь их. Вот как я переделал:
Вот так считал:
Reg->RootKey = HKEY_LOCAL_MACHINE;
Reg->OpenKey("\\SOFTWARE\\xxxx\\xx\\1",false);
byte buff[800];
Reg->ReadBinaryData("1",buff,size);


а вот в файл не знаю как записать... это всё-таки массив, его же потом ещё считать в переменную buff опять надо будет... да ещё и в реестр пихануть и чтобы была точная копия... sad.gif
Kmet
Цитата(IIaBeJl @ 15:07:2008 - 11:39) *
fwrite(datalen,[b] strlen(datalen)+1[/b], sizeof(datalen), stream);


ничего не смущает?
IIaBeJl
Вроде как исправил...

Reg->RootKey = HKEY_LOCAL_MACHINE;
Reg->OpenKey("\\SOFTWARE\\xxxx\\xx\\1",false);
byte buff[800];
int size = Reg->GetDataSize("1");
Reg->ReadBinaryData("1",buff,size);
FILE *stream;
stream = fopen("c:\\my.file", "w+");
fwrite(buff, size, 1, stream);


Всё, записывает... Правда не точно... Данные после добавления из файла в реестр примерно на половине записи начинают отличаться...
Вот как записываю в реестр:
FILE *stream;
stream = fopen("c:\\my.file", "к+");
fread(&buff, 601, 1, stream);
Reg->OpenKey("\\Software\\xxxx\\xx",true);
Reg->CreateKey("99");
Reg->OpenKey("\\SOFTWARE\\xxxx\\xx\\99",true);
Reg->WriteBinaryData("1", buff, 601);
fclose(stream);


Почему данные после внесения в реестр на половине начинают отличаться от оригинала???
zubr
А размер значения и размер буфера одинаковы? Правильно было бы, определить размер значения и по нему выделить динамический массив. Соответственно при записи записывать правильный размер значения.
IIaBeJl
Цитата(zubr @ 16:07:2008, 06:08 ) *
А размер значения и размер буфера одинаковы? Правильно было бы, определить размер значения и по нему выделить динамический массив. Соответственно при записи записывать правильный размер значения.


Уже изменил... Узнал через int size = Reg->GetDataSize("1"); размер значения в реестре... получил 599, взял и массиву столько выделил byte buff[599], и в записи переменной под буффер столько же выделяется fwrite(buff, size, 1, stream); . Но всё равно такие же проблемы, на половине записи значения начинают не совпадать...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.