Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Считывание реестра, Считывание реестра и модификация реестра 
V
    Опции темы
Bima
Дата 15.8.2006, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Добрый день!
Есть раздел в реестре:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\{E2850339-5E51-4BE7-8B70-926129663F31}\Parameters\Tcpip
в нем находится ключ: IPAddress. 
regedit показывает, что этот ключ имеет тип REG_MULTI_SZ.

Теперь сам вопрос, как можно считать этот параметр (если быть более точным, то как мне считать и преобразовать его в тип AnsiString)?
И второй вопрос, как модифицировать этот параметр?


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
_hunter
Дата 15.8.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



читай справку на предмет класса TRegistry вообще и его методов Read/WriteString в частности...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Bima
Дата 15.8.2006, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Очень полезный ответ!!!
Я спрашивал помощи, а не подобных советов.
Метод Read/WriteString применим только для строковых параметров. В regedit такие параметры отображаются  REG_SZ. При использовании подобного метода, моя программа выдает ошибку.


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
_hunter
Дата 15.8.2006, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



во-первых: что за ошибка.
во-вторых: кто мешает воспользоваться ReadBinaryData/WriteBinaryData (это если подходящих методов нет)


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Bima
Дата 15.8.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



При вызове процедуры ReadString (при работе программы) выдает ошибку, что тип переменной чтения неправильный.
При использовании метода ReadBinaryData тоже выдает ошибку "Failed tj get data for 'IPAddres'

Даже если я считаю эти данные, то каким образом мне их преобразовать в AnsiString.

Вот код подпрограммы:
Код

AnsiString NetKey;
int siz;
void *Buffer;
....
if (Reg->OpenKey("SYSTEM\\CurrentControlSet\\Services\\"+NetKey+"\\Parameters\\TcpIp",false))
   {
   siz=Reg->GetDataSize("IPAddress");
   EIp->Text=Reg->ReadBinaryData("IPAddress", Buffer, siz);
   }
else
   {
    // test
   }
Reg->CloseKey();




--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
_hunter
Дата 15.8.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



дык а память под буффер кто выделять будет?
насчет преобразования:
Цитата

REG_MULTI_SZ 
Array of null-terminated strings that are terminated by two null characters. 

(MSDN)


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
dumb
Дата 15.8.2006, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



Bima, внимательней читай хелп. третий параметр ReadBinaryData (у тебя - siz) - это не размер считываемых данных, а размер буфера для чтения.

и вообще... IP Helper smile

Добавлено @ 13:33 
тоже может помочь
PM MAIL   Вверх
Bima
Дата 15.8.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Цитата

Array of null-terminated strings that are terminated by two null characters

В том то вся и фигня, что через симол там ставится нулевой символ

у меня вот такой код:
Код

int siz;
void *Buffer;
char buf[128];
....
if (Reg->OpenKey("SYSTEM\\CurrentControlSet\\Services\\"+NetKey+"\\Parameters\\TcpIp",false))
   {
   siz=Reg->GetDataSize("IPAddress");
   Buffer=&buf;
   EIp->Text=Reg->ReadBinaryData("IPAddress", Buffer, siz);
   }
else
   {
    // test
   }
Reg->CloseKey();


но когда я смотрю char, то там такая мешанина символов, причем символов /0 очень много.
при просмотре выдает следущее:
1\09\02\0.\01\06\08 и так далее. отсюда угадывается адрес который я считываю 192.168.... но в поле EIp->Text отображается "26"


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
_hunter
Дата 15.8.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



в чем фигня -- так и не понял. что мешает строке иметь длинну в один символ?
+ тут не через символ а через число
++ приводил бы уже в HEX' е -- а то такое читать не особо приятно...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
dumb
Дата 15.8.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



фпоиск. смотри объяснение своим "нулям" в третьем найденном посте.
PM MAIL   Вверх
Bima
Дата 15.8.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Пока все получилось, привожу код который я использовал:
Код

int siz;
char buf[128];
....
if (Reg->OpenKey("SYSTEM\\CurrentControlSet\\Services\\"+NetKey+"\\Parameters\\TcpIp",false))
   {
   siz=Reg->GetDataSize("IPAddress");
   Reg->ReadBinaryData("IPAddress", buf, siz);
   EIp->Text=buf;   
   }
else
   {
    // test
   }
Reg->CloseKey();

а вот код для записи параметра:
Код

AnsiString adr;
int siz;
char buf[128];
....
if (Reg->OpenKey("SYSTEM\\CurrentControlSet\\Services\\"+NetKey+"\\Parameters\\TcpIp",false))
   {
   adr=EIp->Text+'\0'+'\0';
   adr.WideChar(buf, adr.Length());
   siz=2*adr.Length()-2;
   Reg->WriteBinaryData("IPAddress", buf, siz);
   }
Reg->CloseKey();


Вроде все работает, но если есть советы по оптимизации кода - всегда выслушаю.


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Bima
Дата 15.8.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Блин, в 98 работает, а в ХР не хочет smile


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
_hunter
Дата 15.8.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



пересобери на машине с XP


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Bima
Дата 16.8.2006, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Пересобрал, но выявил новый глюк:
Когда я делаю запись, то в реестре вместо ключа REG_MULTI_SZ, появляется ключ REG_BINARY, а мне это не нужно.
Так как всетаки записывать параметры в реестр, что бы они были REG_MULTI_SZ???


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
_hunter
Дата 16.8.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



значит забиваем на VCL и пишем/читаем данные сами: RegOpenKeyEx, RegSetValueEx


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0598 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.