Реестр и двоичные данные

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем IIaBeJl, 11 июл 2008.

  1. IIaBeJl

    IIaBeJl Гость

    Подскажите плиз... У меня есть двоичная запись в реестре, мне надо её просто выгрузить в текстовом виде и загрузить в реестр в другой ключ... Вот и всё! Выгружать можно в файл в любом формате, хоть просто код бинарный, хоть в спец файл .reg... Не имеет разницы, главное чтобы потом опять в реестр идентичную копию этих данных записать... Главное чтобы данные были двоичными в реестре и имели соответствующий формат...
     
  2. etc

    etc Гость

    И чем же помочь? Ну вот есть такой тип TRegistry для работы с реестром.
     
  3. IIaBeJl

    IIaBeJl Гость

    на всех форумах мне так отвечали, но когда я начинаю им подробнее объяснять что он не пашет все сразу молчат как рыбы... и затихают как-будто все ламеры такие же как и я...
    Вот один из способов как я пытался делать: у меня есть файл .reg, он создавался с помощью функции экспорта в regedit(не через командную строку!!! а через спец контекстное меню, потому что эти 2 вида создания создают файлы .reg с разным синтаксисом), в нём добавление соответствующих данных, но мне надо не через этот файл добавить а программно... вот как выглядят двоичные данные в файле .reg:
    Код (Text):
    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.
    Я вносил так:
    Код (Text):
    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, ":" и ",".) а они видно как-то преобразуются перед вношением в реестр и получается другая строка в реестре:
    Код (Text):
     68 65 78 3a 31 30 2c 30 30 2c 30 63 2c
    ... ну и так далее... мне короче надо чтобы они не преобразовывались так.Вот что должно получиться после вношения данных в реестр:
    Код (Text):
    "1"=10 00 00 0c 6b 00 69 00 6c 00 6c 00 65 00 72 00 30 00 01 01 98 47 fc
     
  4. etc

    etc Гость

    Что-то не понял, а зачем вам файл? вы собираетесь данные нести на другую машину?

    а что значит не пашет?


    Этот файл предназначен для импорта через редактор, для програмы он в таком виде конечно же не подойдет.
     
  5. IIaBeJl

    IIaBeJl Гость

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


    ну тот способ который я привёл не работает...
    Ладно, забьём на этот способ... Есть другой? Скажите как и желательно с примером...
     
  6. etc

    etc Гость

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

    ps: думаю вы догадались что там 16-ричный формат? :wacko:
     
  7. IIaBeJl

    IIaBeJl Гость

    ну там для идиотов написано hex: :)
    Вот это не получается...(((( Вот что пишу:

    Код (Text):
    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"
     
  8. etc

    etc Гость

    А почему вы решили именно таким типом читать?
     
  9. IIaBeJl

    IIaBeJl Гость

    Та я не только таким типом пытался читать... пытался и char-ом читать... тоже самое получил... просто искал в гугле ткое и было написано что вот таким типом прочитать можно...
     
  10. etc

    etc Гость

    А каким туда записывали?
     
  11. IIaBeJl

    IIaBeJl Гость

    данные в реестр записывала программа, вид данных я вам написал... зачем мне ща думать про записывание данных если я их ещё даже не считал... вы мне подскажите как их считать? а то ошибки только выскакивают при моём синтаксисе
     
  12. zubr

    zubr Гость

    IIaBeJl
    В ключе, который ты собираешься прочитать 50 байт, а ты создаешь буфер размером 4 байта. Создай в качестве буфера массив байт соответствующей длины.
     
  13. IIaBeJl

    IIaBeJl Гость

    Уууу, я же совсем забыл... я ещё в файл данные реестра должен записать, а потом их из файла в реестр засунуть...
    Вот как я делал и у меня данные в исходной записи отличались от полученной записи:
    Сперва вот так вот записывал:
    Код (Text):
    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);
    затем так считывал:
    Код (Text):
    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);
     
  14. IIaBeJl

    IIaBeJl Гость

    Я тут кое-что переделал, но всё равно надо в файл добавить значения и извлечь их. Вот как я переделал:
    Вот так считал:
    Код (Text):
    Reg->RootKey = HKEY_LOCAL_MACHINE;
    Reg->OpenKey("\\SOFTWARE\\xxxx\\xx\\1",false);
    byte buff[800];
    Reg->ReadBinaryData("1",buff,size);
    а вот в файл не знаю как записать... это всё-таки массив, его же потом ещё считать в переменную buff опять надо будет... да ещё и в реестр пихануть и чтобы была точная копия... :rolleyes:
     
  15. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.018
    Симпатии:
    1
    ничего не смущает?
     
  16. IIaBeJl

    IIaBeJl Гость

    Вроде как исправил...

    Код (Text):
    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);
    Всё, записывает... Правда не точно... Данные после добавления из файла в реестр примерно на половине записи начинают отличаться...
    Вот как записываю в реестр:
    Код (Text):
    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);
    Почему данные после внесения в реестр на половине начинают отличаться от оригинала???
     
  17. zubr

    zubr Гость

    А размер значения и размер буфера одинаковы? Правильно было бы, определить размер значения и по нему выделить динамический массив. Соответственно при записи записывать правильный размер значения.
     
  18. IIaBeJl

    IIaBeJl Гость

    Уже изменил... Узнал через int size = Reg->GetDataSize("1"); размер значения в реестре... получил 599, взял и массиву столько выделил byte buff[599], и в записи переменной под буффер столько же выделяется fwrite(buff, size, 1, stream); . Но всё равно такие же проблемы, на половине записи значения начинают не совпадать...
     
Загрузка...
Похожие Темы - Реестр двоичные данные
  1. jaGGa
    Ответов:
    1
    Просмотров:
    1.423
  2. alekssgor
    Ответов:
    1
    Просмотров:
    2.004
  3. Vadik(R)
    Ответов:
    2
    Просмотров:
    3.600
  4. Allexei
    Ответов:
    4
    Просмотров:
    3.743
  5. Gamlet
    Ответов:
    2
    Просмотров:
    2.457

Поделиться этой страницей