C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

  ЗакрытаНовая темаНовый опрос
Срочно нужна помощь!!!, Registry
riff-raff
Отправлено: 06.10.2003, 22:10


Ученик-кочегар

Группа: Участник
Сообщений: 24



Как написать функцию, которая из заданного ключа реестра считывает названия и значения параметров(не только строковых, но и DWORD и др.) и помещает эти данные в Memo.
Garrett
Отправлено: 06.10.2003, 22:32


Дежурный стрелочник

Группа: Участник
Сообщений: 39



ПисАть ручками, а читать глазками о функциях:

RegCloseKey
RegConnectRegistry
RegCreateKey
RegCreateKeyEx
RegDeleteKey
RegDeleteValue
RegEnumKey
RegEnumKeyEx
RegEnumValue
RegFlushKey
RegGetKeySecurity
RegLoadKey
RegNotifyChangeKeyValue
RegOpenKey
RegOpenKeyEx
RegQueryInfoKey
RegQueryMultipleValues
RegQueryValue
RegQueryValueEx
RegReplaceKey
RegRestoreKey
RegSaveKey
RegSetKeySecurity
RegSetValue
RegSetValueEx
RegUnLoadKey
Георгий
Отправлено: 06.10.2003, 23:43


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Попробуй TRegIniFile и посмотри пример к описанию конструктора.
А также тебе помогут методы ReadSections и ReadSectionValues.

PS. в последнее время название темы вроде "I need help" стало популярным.
riff-raff
Отправлено: 07.10.2003, 17:59


Ученик-кочегар

Группа: Участник
Сообщений: 24



Легко говорить.... Строковые параметры из реестра прога читает, а DWORD — нет. Как DWORD читать?
Георгий
Отправлено: 07.10.2003, 21:18


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



действительно DWORD не читает — у меня говорит, что "Invalid data type for '<имя поля>'"
Garrett
Отправлено: 08.10.2003, 07:10


Дежурный стрелочник

Группа: Участник
Сообщений: 39



Если не хотите APİ, то тогда нужно использовать класс TRegistry. А там TRegistry::GetDataType...
riff-raff
Отправлено: 10.10.2003, 21:59


Ученик-кочегар

Группа: Участник
Сообщений: 24



Да, точно... Сначала затем GetDataType, а потом switch на все типы, и все читает(для Binary еще и GetDataSize)...
riff-raff
Отправлено: 10.10.2003, 22:02


Ученик-кочегар

Группа: Участник
Сообщений: 24



Отсюда другой вопрос.... При считывании Binary используется буфер, а как записать Binary? Как заполнить буфер, ведь форматы не совпадают?
riff-raff
Отправлено: 12.10.2003, 14:11


Ученик-кочегар

Группа: Участник
Сообщений: 24



И как считать несколько разных параметров из одного ключа, ведь GetValueNemes и подобное работают только для String???
Admin
Отправлено: 12.10.2003, 17:44


Владимир

Группа: Администратор
Сообщений: 1190



Ну я не понял, в чем вопрос. И пишем и читаем.

Binary

Как прочитать такие данные? Вспомним, что в нашем распоряжении
есть метод GetDataType, позволяющий определить тип данных, метод
GetDataSize, возвращающий размер данных и метод ReadBinaryData
для чтения данных. Так как нам известен размер данных, мы можем
....
И записать можем.


CODE

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <registry.hpp>
const char *RegKey = "Software\\Borland\\RegList";
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// читаем данные из HKEY_CURRENT_USER\Software\Borland\RegList
void __fastcall TForm1::Button1Click(TObject *Sender)
{

byte buff[6];
AnsiString s;

TRegistry* reg = new TRegistry;
if(reg->OpenKey(RegKey, false))
{
Memo1->Lines->Add(reg->ReadString("StrData"));
Memo1->Lines->Add(FloatToStr(reg->ReadFloat("DWORDData")));
Memo1->Lines->Add(IntToStr(reg->ReadInteger("INTData")));
if(reg->GetDataType("BinData") == rdBinary){
int size = reg->GetDataSize("BinData");
reg->ReadBinaryData("BinData",buff,size);
for(int i=0; i<size; i++)
s = s + Format(" %2x",ARRAYOFCONST((buff[i])));
Memo1->Lines->Add(s);
}
reg->DeleteKey(RegKey);
}
delete reg;
}
//---------------------------------------------------------------------------
// пишем в реестр в HKEY_CURRENT_USER\Software\Borland\RegList
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TRegistry* reg = new TRegistry;
byte buff[]={0x24,0,0,0,0x2E,0xA0};

reg->OpenKey(RegKey, true);
reg->WriteString("StrData","My String Data ini");
reg->WriteFloat("DWORDData",2735.14);
reg->WriteInteger("INTData",1021);
reg->WriteBinaryData("BinData",buff,sizeof(buff));

delete reg;
}
//--------------------------------------------------


Также прочтите:
http://src.fitkursk.ru/articles/art0000040_1.asp


Отредактировано Admin — 12/10/2003, 18:50
riff-raff
Отправлено: 12.10.2003, 21:15


Ученик-кочегар

Группа: Участник
Сообщений: 24



Спасибо. А если в ключе несколько параметров каждого вида, то что делать? Ведь GetValueNames работает только для строковых параметров...
riff-raff
Отправлено: 12.10.2003, 21:17


Ученик-кочегар

Группа: Участник
Сообщений: 24



...или я чего-то не совсем понимаю?..
Admin
Отправлено: 12.10.2003, 21:22


Владимир

Группа: Администратор
Сообщений: 1190



Ну так мы и читаем/пишем из ключа "Software\\Borland\\RegList"
несколько параметров разных типов (не используя GetValueNames)

---

А как это сделать через GetValueNames есть в вышеприведенной
ссылке, только там на Delphi но перевести должно быть не
сложно.

Отредактировано Admin — 12/10/2003, 22:28
riff-raff
Отправлено: 12.10.2003, 21:37


Ученик-кочегар

Группа: Участник
Сообщений: 24



Спасибо огромное! А что это за директива #pragma hdrstop?
Admin
Отправлено: 12.10.2003, 21:47


Владимир

Группа: Администратор
Сообщений: 1190



Так это ее сам Builder добавляет.

http://inprise.narod.ru/cbuilder/archives/..._979825773.html
http://www.rxlib.ru/faqs/faqc_en/21942.html
riff-raff
Отправлено: 13.10.2003, 17:53


Ученик-кочегар

Группа: Участник
Сообщений: 24



А как сделать это все через функцию: чтобы кнопка только вызывала функцию. Проблема еще в том, что я не знаю какой тип должна иметь ф-ция. Будет хорошо, если это будет продемонстрировано наглядно.
riff-raff
Отправлено: 13.10.2003, 19:16


Ученик-кочегар

Группа: Участник
Сообщений: 24



Кстати, представленный код выдает только указанные в нем параметры, а нельзя ли сделать так, чтобы выводились все подряд, как в редакторе реестра?
Admin
Отправлено: 14.10.2003, 11:05


Владимир

Группа: Администратор
Сообщений: 1190



Можно. Посмотрите help по TRegistry в Builder и
там все функции подробно расписаны:

GetDataInfo
GetDataSize
GetDataType
GetKeyInfo
GetKeyNames
GetValueNames
HasSubKeys
и другие...

CODE

void __fastcall TForm1::Button3Click(TObject *Sender)
{
TRegDataInfo RValue;
byte buff[1024];

TRegistry* reg = new TRegistry;

if(reg->OpenKey(RegKey, false))
{
reg->GetValueNames(Memo1->Lines);
for(int i=0; i<Memo1->Lines->Count; i++){
reg->GetDataInfo(Memo1->Lines->Strings[i], RValue);
AnsiString s;
s = Memo1->Lines->Strings[i]+", size: "+IntToStr(RValue.DataSize);
switch(RValue.RegData){

case rdString: s = s + ",type: rdString , value: "+
reg->ReadString(Memo1->Lines->Strings[i]);
break;

case rdInteger: s = s + ",type: rdInteger , value: "+
IntToStr(reg->ReadInteger(Memo1->Lines->Strings[i]));
break;

case rdBinary: s = s + ",type: rdBinary ";
int size = reg->GetDataSize(Memo1->Lines->Strings[i]);
reg->ReadBinaryData(Memo1->Lines->Strings[i],buff,size);
for(int i=0; i<size; i++)
s = s + Format(" %2x",ARRAYOFCONST((buff[i])));
break;

}
Memo2->Lines->Add(s);
}}
delete reg;
}
//--------------------------



Если указанная выше статья недоступна
по адресу: http://src.fitkursk.ru/articles/art0000040_1.asp
то ее сохраненную копию можно скачать здесь:
http://cbuilder.ru/Upload/tregistry.rar


Отредактировано Admin — 15/10/2003, 17:00
Garrett
Отправлено: 14.10.2003, 11:36


Дежурный стрелочник

Группа: Участник
Сообщений: 39



Владимир, надо закрыть тему, Риф-Раф, наверное прикалывается.
С 6-го октября можно было выучить не только TRegistry, но и написать вокруг него пару программ.

Вернуться в Вопросы программирования в C++Builder
ЗакрытаНовая темаНовый опрос