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, но и написать вокруг него пару программ. |
|