Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ Builder

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 304, средняя оценка - 4.83
NiTan
Покинул форум
3152 / 1335 / 50
Регистрация: 29.01.2010
Сообщений: 2,887
#1

Работа с реестром в C++ Builder - C++ Builder

17.08.2010, 22:37. Просмотров 40273. Ответов 12
Метки нет (Все метки)

Вступление:

Данный FAQ тестировался и писался на системе Windows XP SP2.
Используемый компилятор: Borland C++ Builder 6.0.

Для начала, немного теории о реестре Windows.

История появления реестра
Давным-давно все настройки программ хранились в Ini-файлах, которые представляли из себя обычные текстовые файлы с структурированной записью всех параметров программ. Со временем программы стали расти, как и количество их параметров, и в следствии чего INI-файлы превратились в настоящую свалку, в которой что-либо разобрать было очень сложно.
Поэтому в Microsoft решили создать одну единую базу данных, где хранились бы все настройки и параметры Windows - так появился реестр.

Что из себя теперь представляет реестр Windows
Итак, сегодняшний реестр - это структурированая база данных, в которой хранятся настройки операционной системы, установленных программ, профилей пользователей, сведения о типах файлов и много чего еще. Теперь, обычный двоичный файл размером в 64 кб(Win 3.1) стал одним из основных компонентов Windows, от которого отказаться будет очень сложно...
Реестр состоит из 5 основных разделов, которые включают в себя огромное множество под-разделов, на описание которых уйдет не одно сотня страниц. Поэтому опишу только главные разделы:

HKEY_CLASSES_ROOT - в этом разделе хранится информация о зарегистрированных типах файлов, а также об обьектах COM и ActiveX.

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

HKEY_LOCAL_MACHINE - в этом разделе содержится информация о параметрах конфигурации всех пользователей.

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

HKEY_CURRENT_CONFIG - в этом разделе содержится информация о профиле обурудования, которую локальный компьютер использует при запуске системы.


Минусы реестра

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


А теперь практика

Для того чтобы работать с реестром нужно подключить файл "Registry.hpp"
C++
1
#include "Registry.hpp"
Теперь нам доступен класс TRegistry. Для начала работы необходимо создать объект класса, после чего указать раздел с которым мы будем работать:
C++
1
2
TRegistry *reg=new TRegistry(); //Создали обьект класса TRegistry
   reg->RootKey=HKEY_LOCAL_MACHINE; //Теперь мы будем работать с разделом HKEY_LOCAL_MACHINE (все записи ключей, удаление, перемещение будут происходить в этом разделе)

Запись параметров в реестр

Для записи параметров в реестр у класса TRegistry существует множество функций, которые очень похожи и различаются только в типе записываемой информации. Для обычных строк это WriteString("Name","Value"), для записи целых чисел это WriteInteger("Name",int) и так далее... Список наиболее часто-используемых функций будет приведен ниже.
Прежде чем записать какой-то параметр в определенную ветку реестра, ее нужно открыть Для этого используется функция OpenKey("Key",CanCreate). Первым параметром функции идет имя ключа, открываемого для записи, а вторым параметром идет значение типа bool - при включении этого значения, в случае отсутствия открываемого ключа, он будет создан автоматически. В противном случае, запись в несуществующий ключ не произойдет (что и вполне логично).
Доступ к подключам происходит точно так же как и к самим ключам: допустим, у нас есть ветка реестра "TestProgramm\\Options\\ID".
Для того, чтобы записать какой-то параметр в ключ "TestProgramm" нужно написать так:
C++
1
2
TRegistry *reg=new TRegistry;
reg->OpenKey("TestProgramm",true);
Если же нужно записать что-то в подветку этого ключа, то следует написать вот так:
C++
1
2
TRegistry *reg=new TRegistry;
reg->OpenKey("TestProgramm\\Options",true);
И так далее....

Теперь пример записи обычной строки в реестр:
C++
1
2
3
4
5
6
7
8
9
TRegistry *reg=new TRegistry(); //Создали обьект reg класса TRegistry
reg->RootKey=HKEY_CURRENT_USER;  //Для начала необходимо указать раздел, с которым мы будем работать (список всех разделов был приведен выше).
//В нашем случае это будет HKEY_CURRENT_USER, который стоит по умолчанию
//Теперь нам нужно указать ключ реестра, в который будет происходить запись.
reg->OpenKey("\NitanTest",true); //Мы создали ключ, если же такой ключ уже существовал, то он был бы открыт для записи
reg->WriteString("MyName","Nitan"); //Теперь мы записали параметр MyName и задали ему значение Nitan
reg->CloseKey();   //Закрываем ключ
delete reg;       //Освобождаем память
//Можно открыть реестр и полюбоваться на проделанную работу.
Список наиболее часто-используемых функций для записи ключей в реестр:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
   TRegistry *reg=new TRegistry();
   reg->OpenKey("Test",1);
//-----------------------------------------------------------------------
 
   int i=150;
   reg->WriteInteger("Int",i);  //Записывает целое число i в параметр "Int" открытого ключа
//-----------------------------------------------------------------------
 
   bool b=true;
   reg->WriteBool("Bool",b);  //Записывает булевое значение b в параметр "Bool" открытого ключа
//-----------------------------------------------------------------------
 
   float f=3.1416;
   reg->WriteFloat("Float",f);  //Записывает действительное число f в параметр "Float" открытого ключа
//-----------------------------------------------------------------------
 
   String s="String";
   reg->WriteString("String",s);  //Записывает обычную строку в параметр "String" открытого ключа
//-----------------------------------------------------------------------
 
   TDateTime *dt;
   reg->WriteDateTime("DateTime",dt->CurrentDateTime());  //Записывает значение даты и времени из dt в параметр "DateTime" открытого ключа
//-----------------------------------------------------------------------
 
   char *buffer=new char;
   reg->WriteBinaryData("BinaryData",buffer,strlen(buffer));  //Записывает двоичное значение из buffer заданным размером. Размер записываемых данных не должен превышать 2048 байт.
//Таким образом можно хранить любую информацию в реестре (даже какой-нибудь файл), но в Microsoft этого не одобряют и советуют в реестре хранить имя файла, а сам файл отдельно.
//-----------------------------------------------------------------------
 
  reg->CloseKey();
   delete reg;
Во всех выше-описанных функциях поле "Name", если оно не существует, будет созданно автоматически.



Чтение параметров из реестра

Чтение параметров из реестра происходит точно также, как и запись, только в этом случае каждая функция возвращает значение определенного типа. К примеру, чтобы прочитать параметр, содержащий обычную строку, сделать это стоит следующим образом:
C++
1
String s=reg->ReadString("Name"); //Name - это имя считываемого параметра
Список основных функций для считывания опять будет приведен в конце.

Теперь простой пример считывания параметра из реестра:
C++
1
2
3
4
5
6
7
8
TRegistry *reg=new TRegistry(); //Создали обьект reg класса TRegistry
reg->RootKey=HKEY_CURRENT_USER;  //Как и при записи указываем раздел с которым будем работать
reg->OpenKeyReadOnly("NitanTest"); //Теперь открываем ключ для чтения (можно было бы и использовать OpenKey(), но эта функция позволяет только читать параметры )
AnsiString test;     //Строка в которую мы занесем значение параметра из реестра
test=reg->ReadString("MyName");   //Заносим значение, указан при этом нужный нам параметр
ShowMessage(test);    //Любуемся правильным результатом
reg->CloseKey();   //Закрываем ключ
delete reg;       //Освобождаем память
Список основных функций для чтения параметров из реестра
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
TRegistry *reg=new TRegistry();
   reg->OpenKey("Test",1);
 
   int i;
   i=reg->ReadInteger("Int");  //Считываем целое значение параметра "Int" и присваиваем его переменной i
//-----------------------------------------------------------------------
 
   bool b;
   b=reg->ReadInteger("Bool");  //Считываем булевое значение из параметра "Bool" и присваиваем его переменной b
//-----------------------------------------------------------------------
 
   String s;
   s=reg->ReadString("String");  //Считываем обычную строку из параметра "String" и присваиваем его переменной s
//-----------------------------------------------------------------------
   
 
   char *buffer=new char;
   int size=reg->GetDataSize("BinaryData");   //Получаем длину записанного параметра, потому как ReadBinary требует размер строки для считывания
   reg->ReadBinaryData("BinaryData",buffer,size);  //Читаем двоичное значение в buffer заданным размером.
//-----------------------------------------------------------------------
 
   reg->CloseKey();
   delete reg;
:


Удаление ключей и разделов

Мусорить не хорошо, потому нужно после себя убирать (удалять параметры из реестра, естественно, нужно тогда, когда программа больше не будет к ним обращаться, на пример, при деинсталяции(удалении с компьютера) программы. Для этого существует две функции:

DeleteValue() - удаление параметра:
C++
1
2
3
4
5
6
TRegistry *reg=new TRegistry(); //Создали обьект reg класса TRegistry
reg->RootKey=HKEY_CURRENT_USER;  //Как и при записи указываем раздел с которым будем работать
reg->OpenKey("NitanTest",false);   //Октрываем ключ, над которым будем работать
reg->DeleteValue("MyName");     //Удаляем параметр
reg->CloseKey();   //Закрываем ключ
delete reg;       //Освобождаем память
DeleteKey() - удаление всего ключа:
C++
1
2
3
4
5
TRegistry *reg=new TRegistry(); //Создали обьект reg класса TRegistry
reg->RootKey=HKEY_CURRENT_USER;  //Как и при записи указываем раздел с которым будем работать
//Здесь окрывать ключ не надо, так как мы его не сможем удалить перед того, как к нему обратились, для этого его нужно будет закрыть
reg->DeleteKey("NitanTest");  //Удаляем ключ
delete reg;       //Освобождаем память
Переименовывание параметров

Для того, чтобы переименовать параметр нужно чтобы этот параметр существовал и чтобы параметра, который бы соответствовал новому имени не существовало:
C++
1
2
3
4
5
TRegistry *reg=new TRegistry();
   reg->OpenKey("Test",0);
 reg->RenameValue("OldName","NewName"); //OldName - старое имя параметра. NewName - новое имя.
   reg->CloseKey();
   delete reg;

Как узнать, имеется-ли в определенном ключе какой-то параметр?

Для этого существует функция ValueExists("Name"), которая вовращает 1, если параметр существует и 0, если параметра не существует:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
TRegistry *reg=new TRegistry();
   reg->OpenKey("Test",0);
 
  if(reg->ValueExists("BBala"))  //Если параметр в заданном ключе существует
 
MessageBox(0,"Параметр \"BBala\" в ключе \"Test\" существует","Проверка",MB_OK);  //Сообщаем радостную новость
 
  else  //В противном случае
MessageBox(0,"Параметр \"BBala\" в ключе \"Test\" не существует","Проверка",MB_OK); //Огорчаем
 
 
   reg->CloseKey();
   delete reg;
Как скопировать, переместить ключ?

Для этого можно воспользоваться функцией MoveKey(String OldName, String NewName, bool Delete) - копируем ключ "OldName" в "NewName", если Delete=true, то автоматически удаляется ключ OldName:
C++
1
2
3
   TRegistry *reg=new TRegistry();
   reg->MoveKey("Test","Environment\\Test",false);  //Копируем ключ Test в подраздел Environment
   delete reg;
Сохранение и загрузка ключей в файл

Для сохранения и загрузки ключей в TRegistry существует 2 функции: SaveKey("Key","FileName") и LoadKey("Key","FileName"). Первым параметром в этих функциях идет имя ключа, над которым будет происходить загрузка/сохранения, а вторым - имя файла в который будет сохранен или загружен ключ реестра.
Пример:
C++
1
2
3
4
   TRegistry *reg=new TRegistry(KEY_ALL_ACCESS);
   reg->RootKey=HKEY_CURRENT_USER;
   reg->SaveKey("Test","E:\\test"); //Сохранение
   delete reg;
C++
1
2
3
4
   TRegistry *reg=new TRegistry(KEY_ALL_ACCESS);
   reg->RootKey=HKEY_CURRENT_USER;
   reg->LoadKey("Test","E:\\test"); //Загрузка
   delete reg;
Как получить список всех параметров заданного ключа?

Для этого предназначена функция GetValueNames(TStringList *List), которая передает все параметры ключа в заданный список List.
Пример использования:
C++
1
2
3
4
5
6
   TRegistry *reg=new TRegistry();
   reg->OpenKey("Test",0);   //Окрываем нужный нам ключ
   TStringList *l=new TStringList;  //Обьект типа TStringList в котором будет храниться список всех параметров
   reg->GetValueNames(l); //Получаем список всех параметров и передаем его в l
   ShowMessage(l->Text);  //Просто проверка
   delete reg; //Очищаем память

Как получить список всех подключей заданного ключа?

Для этого предназначена функция GetKeyNames(TStringList *List), которая передает все параметры ключа в заданный список List.
Пример использования:
C++
1
2
3
4
5
6
   TStringList *l=new TStringList;   //Список, в котором будет хранится 
   TRegistry *reg=new TRegistry();
   reg->OpenKey("Software",0);  //Открываем ключ
   reg->GetKeyNames(l);
   ShowMessage(l->Text);
   delete reg;
Автор: NiTan
32
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2010, 22:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с реестром в C++ Builder (C++ Builder):

Работа с реестром. - C++ Builder
помогите плз найти, пишет error 6 ocured: void __fastcall TForm1::btnRestoreClick(TObject *Sender) { TCHAR szErrMsg; ...

Работа с реестром - C++ Builder
пробую сделать такую штуку: regm->OpenKeyReadOnly("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers"); TStringList...

Работа с реестром. - C++ Builder
:help:Пытаюсь сделать свой твик по ХРюшу,:huh:Помогите пожалуйста, ехе у меня почемуто запускаеться через раз, и то с ошибкой, и не могу...

Работа с реестром - C++ Builder
Можете, пожалуйста, подсказать что придумать. Мне нужно в своей программе сделать разграничение возможностей в зависимости от...

Работа с реестром - C++ Builder
Всем привет. Учусь работать с реестром. Накодил вот такое reg->RootKey= HKEY_CURRENT_USER; reg->OpenKey("Software",true); ...

Работа с реестром(автозагрузка) - C++ Builder
Ув программисты при работе с автозагрузкой получилось ее сделать.т.е. записать строку в реестре в ключ run.программа теперь каждый раз как...

12
MikeSoft
Эксперт С++
3802 / 1778 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
21.08.2010, 16:06 #2
По этой статье есть небольшое дополнение.

Класс TRegistry имеет перегруженный конструктор, задекларированный как:
C++
1
2
__fastcall TRegistry(void)/* overload */;
__fastcall TRegistry(unsigned AAccess)/* overload */;
Как мы видим, при создании объекта класса TRegistry, можно управлять атрибутом безопасности.

Параметр AAccess может принимать следующие значения:
  • KEY_CREATE_LINK - Permission to create a symbolic link.
  • KEY_CREATE_SUB_KEY - Permission to create subkeys.
  • KEY_ENUMERATE_SUB_KEYS - Permission to enumerate subkeys.
  • KEY_EXECUTE - Permission for read access.
  • KEY_NOTIFY - Permission for change notification.
  • KEY_QUERY_VALUE - Permission to query subkey data.
  • KEY_READ - Combination of KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, and KEY_NOTIFY access.
  • KEY_SET_VALUE Permission to set subkey data.
  • KEY_WRITE Combination of KEY_SET_VALUE and KEY_CREATE_SUB_KEY access.
  • KEY_ALL_ACCESS - Combination of KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, KEY_NOTIFY, KEY_CREATE_SUB_KEY, KEY_CREATE_LINK, and KEY_SET_VALUE access.

Соответственно, могут возникнуть моменты, когда доступ к определённым действиям в реестре ограничить. В таком случае, программа может прервать выполнение нужного действия.
Для того, чтобы избежать подобных проблем, необходимо выполнять проверку на успешность создания объекта.

Вариант 1 (упрощённый):
C++
1
2
3
4
TRegistry *reg = new TRegistry(KEY_ALL_ACCESS);
if (reg) {
  // набор действий...
}
Вариант 2 (заключается в использовании блоков try ... catch):
C++
1
2
3
4
5
6
7
8
9
10
11
TRegistry *reg = NULL;
try {  // предпринимаем попытку выполнить блок нижеописанного кода
  reg = new TRegistry(KEY_ALL_ACCESS);
  if (reg) {  // проверка создания
    // набор действий при успешном создании ...
  } else {
    // набор действий при возвращении нулевого указателя ...
  }
} catch (...) { // перехват всех неудачных действий, возникших в вышеописанном участке кода
  // набор действий в случае возникновения исключений ...
}
Соответственно, можно использовать и блоки с __finally.

После завершении использования не забываем очищать память:
C++
1
2
3
4
if (reg) {
  delete reg;
  reg = NULL;
}
16
Maestro
Маэстро
Вирусоборец
1239 / 363 / 28
Регистрация: 06.09.2009
Сообщений: 780
21.08.2010, 18:18 #3
А как создать и работать с TRegistry со следующими параметрами:

1. Мультистроковой параметр
2. Расширяемый строковой параметр

Спасибо.
0
NiTan
Покинул форум
3152 / 1335 / 50
Регистрация: 29.01.2010
Сообщений: 2,887
21.08.2010, 18:46  [ТС] #4
Я не уверен, но, по-моему, в Билдере с мультистроковым параметром работать нельзя, если я не прав, то подправьте меня, а вот с расширяемым строковым параметром, вроде, так:
C++
1
2
3
4
5
TRegistry *reg=new TRegistry();
reg->OpenKey("Test",1);
reg->WriteExpandString("Name","Value");  //Вот, создали расширяемый строковый параметр
reg->CloseKey();
delete reg;
1
MikeSoft
Эксперт С++
3802 / 1778 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
21.08.2010, 18:55 #5
Maestro, с расширяемым строковым параметром всё просто - реализован метод WriteExpandString.

Для работы с мультистроковым параметром в своё время пришлось реализовать вот такую функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
TStringList *__fastcall GetMultiSz(TRegistry * Registry, AnsiString KeyName, AnsiString ValueName) {
  DWORD BufferSize,ValueType;
  LPSTR ptr,Buffer;
  TStringList *ReturnValue = NULL;
  Registry->OpenKey(KeyName, false);
  RegQueryValueExA(Registry->CurrentKey,(const char *)ValueName.data(),NULL,&ValueType,NULL,&BufferSize);
  Buffer = new CHAR[BufferSize];
  RegQueryValueExA(Registry->CurrentKey,(const char *)ValueName.data(),NULL,&ValueType,Buffer,&BufferSize);
  ReturnValue = new TStringList;
  if( ValueType == REG_MULTI_SZ ) {
    ptr = Buffer;
    while( *ptr != 0 ) {
      ReturnValue->Add(ptr);
      ptr += strlen(ptr)+1;
    }
  }
  delete []Buffer;
  return ReturnValue;
}
3
Maestro
Маэстро
Вирусоборец
1239 / 363 / 28
Регистрация: 06.09.2009
Сообщений: 780
21.08.2010, 19:47 #6
Цитата Сообщение от Папа Карло Посмотреть сообщение
в Билдере с мультистроковым параметром работать нельзя
Поэтому и спрашиваю, думал, может есть хитрость какая-то.

Ребят, если не будете смеяться, то могу предложить работать с мультистроковым параметром вот так.

Файл .cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
// Скрытие консольного окна--------------------------------------------------
void __fastcall TForm1::RunWaitHide(AnsiString EXEFILE)
{
   char* command = EXEFILE.c_str();
   STARTUPINFO si;
   PROCESS_INFORMATION pi;
   ZeroMemory( &si, sizeof(si) );
   si.cb = sizeof(si);
   si.wShowWindow = SW_HIDE; // вот тут то мы и скроем окно программы
   si.dwFlags = STARTF_USESHOWWINDOW;
   ZeroMemory( &pi, sizeof(pi) );
   if(CreateProcess(NULL, command, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)){
      WaitForSingleObject(pi.hProcess, INFINITE);
     }
   CloseHandle( pi.hProcess );
   CloseHandle( pi.hThread  );
}
// Выполняем эту команду и скрываем консльное окошко-------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   RunWaitHide(Res);
}
// Грубо говоря, формируем команду с ключами---------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   Res = "REG ADD HKLM\\Software /v Test /t REG_MULTI_SZ /d Tester";
}
//---------------------------------------------------------------------------
Файл .h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall FormCreate(TObject *Sender);
private:    // User declarations
   void __fastcall RunWaitHide(AnsiString exefile); // Функция сокрытия консольного окошка
   AnsiString Res; // Переменная для формирования команды
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Всё очень просто, команда WinExec запускает файл REG.EXE находящийся в X:\Windows\system32 с необходимыми ключами (Res) для создания параметра определённого типа, а эта функция RunWaitHide() скрывает консоль.

P.S. Дополнительные команды можно узнать через Пуск - Выполнить - cmd - Enter, в консольном окошке ввести
Код
 reg /?
4
Alexhm
1 / 1 / 0
Регистрация: 05.12.2010
Сообщений: 4
05.12.2010, 17:23 #7
Для простоты работы с реестром я написал компонент который вставляется в любую форму и в любом количестве. Исходники прилагаются.
1
Вложения
Тип файла: rar PackIniForm.rar (4.3 Кб, 509 просмотров)
MrAndrey_ka
78 / 78 / 2
Регистрация: 13.05.2009
Сообщений: 537
Записей в блоге: 1
04.04.2011, 15:19 #8
Так как TRegistry класс делфи, то влезьть в него и кое что изменить С++ не дает, но нет ничего невозможного, я нашел этот файлик в делфи кое что добавил и перекомпилил его под С++...
теперь класс называется TReg
вот нововведения в класе TReg в отличии от TRegistry, все что было в TRegistry осталось не тронуто +:

__property String RootString- тоже что и RootKey но строковой тип;
__property String Path - открывает указанный или возвращает текущий ключь
при открытии использует AutoCreate если ключь не удалось открыть питается открыть только для чтения....
bool AutoCreate - свойство определяющее будет ли создан ключь заданный по Path если его нет
ExistOldPath - возвращает истину если последний ключь заданный по Path удалось открыть или создать

property string Z_String[const Name:string] пишет\читает строковой параметр
property String Z_MultiString[const Name:string] пишет\читает мульти-строковой параметр
property Z_..... - их еще много которые пишут\читают соответствующие типы

TStrings Keys и Values, возвращает список ключей/параметров (удаление списка нужно осуществлять в ручную)TStrings *u=g->Keys();Memo1->Text=u->Text;delete u;

DataTypeToStr переводит типы REG_... в строку

закрывать ключи более не нужно\ они закрываются автоматом при открытии нового или удвлении класса

помоему все....

делимся впечатлениями
2
Вложения
Тип файла: rar registr.rar (21.6 Кб, 334 просмотров)
Evg
Эксперт CАвтор FAQ
18246 / 6371 / 438
Регистрация: 30.03.2009
Сообщений: 17,626
Записей в блоге: 28
04.04.2011, 16:12 #9
Твои коды очень сложно читать, потому что появляется горизонтальный скроллбар. Куда удобнее, когда комментарий написан не справа от строки, а перед строкой. И нормально разбитна несколько строк.

В примере
C++
1
reg->OpenKey("\NitanTest",true);
обратный слэш перед N лишний

*** Update
Хотя удали этот пост. А точнее, перенеси в общий FAQ. А то здесь одни дельные советы в теме и мой пост выглядит не в кассу
0
SergeyS
153 / 145 / 6
Регистрация: 12.03.2011
Сообщений: 807
20.05.2011, 23:17 #10
Возможно подключать программно чужой реестр? Ну как в редакторе "Загрузить куст"?
0
Dondok
18 / 34 / 1
Регистрация: 28.01.2012
Сообщений: 181
18.02.2012, 00:25 #11
Цитата Сообщение от NiTan Посмотреть сообщение
String s;
s=reg->ReadString("String"); //Считываем обычную строку из параметра "String" и присваиваем его переменной s
А как считать значение параметров типа reg_sz? как в цитате делаю, но не получается. Возвращает пустую строку.
0
XLammer
0 / 0 / 0
Регистрация: 19.07.2010
Сообщений: 22
13.05.2012, 19:17 #12
Здравствуйте, подскажите пожалуйста как считывать значение параметра *По умолчанию*
0
MrAndrey_ka
78 / 78 / 2
Регистрация: 13.05.2009
Сообщений: 537
Записей в блоге: 1
14.05.2012, 13:31 #13
XLammer:
C++
1
2
String s;
s=reg->ReadString("");
Dondok, reg_sz это и есть строковой параметр
C++
1
2
String s;
s=reg->ReadString("ИмяПараметра");
0
14.05.2012, 13:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2012, 13:31
Привет! Вот еще темы с ответами:

Работа с реестром Виндовс. TRegistry - C++ Builder
Мне необходимо реализовать простую программку для работы с реестром Виндовс, а точнее для работы с Автозагрузкой. --- Необходимо...

Работа с реестром и перемещение файла. - C++ Builder
1) Не могу создать универсальный исполняемый файл exe, который можно было бы запускать на любом компе. Делаю вроде бы все по схеме: -...

Работа с реестром не с основной формы - C++ Builder
привет! Пишу программу, которая будет сохранять настройки в реестре. В программе три формы, из каждой с них должна быть возможность...

Работа с реестром на основе класса TRegistry - C++ Builder
Пытаюсь прочитать строковый параметр ProductId, в разделе HKEY_LOCAL_MACHINE в ветке SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru