Лабораторная работа №2 Тема: Работа с системным реестром в C++ Builder (Класс tregistry). Ini файлы




Скачать 99.63 Kb.
НазваниеЛабораторная работа №2 Тема: Работа с системным реестром в C++ Builder (Класс tregistry). Ini файлы
Дата публикации07.07.2013
Размер99.63 Kb.
ТипЛабораторная работа
zadocs.ru > Информатика > Лабораторная работа

Лабораторная работа № 2.2

Тема: Работа с системным реестром в C++ Builder (Класс TRegistry). INI файлы.


Цель: Изучить работу с реестром, понять, зачем он нужен. Запись и чтение информации в регистр с помощью класса TRegistry. Регистрация приложения и его настроек в .ini файлах.

Теоретические сведения

Реестр (Registry) - это регистрационная база данных Windows и ее приложений. Раньше все установки записывались в *.ini файлы (например, WINDOWS.INI). Но для того чтоюы упорядочить процессы установки и удаления программ, начиная с Windows95 и NT Microsoft требует, чтобы вся информация о конфигурации системы хранилась в системном реестре. Реестр содержит данные, к которым Windows XP постоянно обращается во время загрузки, работы и ее завершения, а именно:

  • профили всех пользователей, то есть их настройки;

  • конфигурация оборудования, установленного в операционной системе. Я не пишу "установленного в компьютере", поскольку железо может быть, как говорится, "на борту", но не быть установленным в ОС, например, из-за устаревших драйверов.

  • данные об установленных программах и типах документов, создаваемых каждой программой;

  • свойства папок и значков программ;

  • данные об используемых портах.

Чтобы посмотреть что из себя представляет реестр, запустите программу (Пуск->Выполнить) regedit.exe из каталога Windows, которая может и изменять реестр. Реестр имеет иерархическую древовидную структуру, состоящую из разделов, подразделов и ключей (параметров). Разделы и подразделы - это, грубо говоря, папки в левом окне Regedit'а. Ключ реестра, или параметр - это некая переменная, которой присвоено определенное значение, проще говоря - это то, что мы видим в правом окне Regedit'а.

Необходимо заметить три особенности:

1. Все ключи могут иметь различное количество значений разных типов;
2. Ключ может иметь подключи;
3. В любом ключе есть значение «По умолчанию»;

Система ключей очень похожа на файловую систему, да и Regedit похож на проводник. Реестр имеет шесть стандартных корневых ключей:

- содержат характеристики компьютера

1. HKEY_CLASSES_ROOT - это ссылка на раздел HKEY_LOCAL_MACHINE\Software\Classes.

Хранящиеся здесь сведения обеспечивают запуск необходимой программы при открытии файла с помощью проводника.

Этот раздел содержит связи между приложениями[http://journeyboy.ru] и типами файлов, а также информацию об OLE.
2.
3. HKEY_LOCAL_MACHINE - раздел содержит настройки, относящиеся к вашему компьютеру и действительные для всех

пользователей, а также информацию об аппаратной конфигурации и установленном

программном обеспечении.
4. HKEY_CURRENT_CONFIG - это ссылка на HKEY_LOCAL_MACHINE\ SYSTEM \CurrentControlSet\ Hardware Profiles\Current.

Раздел содержит сведения о настройках оборудования, используемых локальным компьютером

при запуске системы, т.е. информацию о текущей конфигурации.

- содержат характеристики пользователя

5. HKEY_CURRENT_USER - это ссылка на определенный подраздел HKEY_USERS.
6. HKEY_USERS - этот раздел содержит настройки для всех пользователей компьютера

Система создает энергозависимые разделы каждый раз при начальной загрузке. Например, HKEY_LOCAL_MACHINE \HARDWARE - раздел реестра, который хранит информацию по физическим устройствам и назначенным им ресурсам. Назначение ресурса и аппаратное обнаружение происходят каждый ра при загрузке системы и эти данные не записываются на диск.


Сердце системного реестра - это раздел ^ HKEY_LOCAL_MACHINE \SYSTEM.


HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE: хранят настройки, изменение которых способно облагородить нашу операционную систему.


Часто для обозначения основных разделов реестра пользуются сокращениями:

^ HKEY_CLASSES_ROOT - HKCR

HKEY_CURRENT_USER - HKCU

HKEY_LOCAL_MACHINE - HKLM

HKEY_USERS - HKU

HKEY_CURRENT_CONFIG - HKCC

Раздел HKEY_USERS содержит все активные загруженные параметры пользователя. Он имеет не менее трех ключей:

  • Подраздел DEFAULT, где хранится используемая конфигурация, когда ни один из пользователей еще не вошел в компьютер. То есть мы еще видим приглашение на вход в систему.

  • Дополнительный подраздел, который имеет имя в соответствии с security ID текущего пользователя (описание SID см. ниже). Этот подключ реестра содержит конфигурацию текущего пользователя. Если пользователь вошел удаленно, данные для конфигурации пользователя сохраняются в системном реестре местного компьютера. Данные из HKEY_USERS\%SID% также появляются в HKEY_CURRENT_USER.

  • Дополнительный подраздел, который имеет имя в соответствии с SID текущего пользователя с суффиксом Classes. Этот раздел содержит классы текущего пользователя. Данные в HKEY_USERS\%SID%_Classes также содержатся в HKEY_CLASSES_ROOT.


Все значения ключей реестра относятся к определенному типу. Описание типов данных:

  • REG_BINARY - двоичные данные. Большинство сведений об аппаратных компонентах хранится в виде двоичных данных и выводится в редакторе реестра в шестнадцатеричном формате.

  • REG_DWORD - целые числа размером в 4 байта. Многие параметры служб и драйверов устройств имеют этот тип и отображаются в двоичном, шестнадцатеричном или десятичном форматах.

  • REG_EXPAND_SZ - строка данных переменной длины.

  • REG_MULTI_SZ - многострочный текст. Этот тип, как правило, имеют списки и другие записи в формате, удобном для чтения.

Записи разделяются пробелами, запятыми или другими символами.

  • REG_SZ - текстовая строка фиксированной длины.

  • REG_FULL_RESOURCE_DESCRIPTOR - последовательность вложенных массивов, разработанная для хранения списка ресурсов железа или драйверов.

Для работы с реестром, есть и стандартные функции ^ API, но в C++ Builder имеется класс TRegistry для работы с реестром. TRegistry имеет четыре свойства:

CurentKey: содержит текущее значение ключа. Значение ключа – это целое число, которое идентифицирует ключ. Обычно от этого свойства мало толку.
^ RootKey: содержит строку - имя текущего корневого ключа (по умолчанию \HKEY_CURENT_USER).
CurrentPath: содержит строку - имя и путь текущего ключа ,без корневого.
LazyWrite: определяет – предавать управление приложению во время записи данных в ключ (true), или не передавать до тех пор пока запись не завершится (false).

Также класс Tregistry содержит несколько методов для работы с реестром. Такие как:

CloseKey - закрывает ключ и записывает в него данные.
CreateKey - создает ключ, но не открывает его.
DeleteKey - удаляет любой ключ, для удаления текущего можно просто передать пустую строку.
GetKeyNames - возвращает потомку TStrings все его подключи.
GetValueNames - возвращает имена всех элементов ключа.
KeyExists - true - если указанный ключ существует, false – если нет.
OpenKey() - открывает указанный ключ, имеет два параметра. Второй параметр отвечает за то создавать ключ если он не существует или нет (true, false).
ValueExists - true – если указанный элемент данных существует.

^ LoadKey, SaveKey -эти методы загружают и сохраняют ключ на диске.

ReadBool - этот и следующие методы читают из указанного элемента ключа данные определенного типа.
ReadDateTime
ReadFloat
ReadInteger
ReadString

WriteBinaryData - этот и следующие методы записывают в указанный элемент ключа данные соотествующего типа.
WriteBool
WriteDateTime
WriteFloat
WriteInteger
WriteString

Механизм работы с реестром следующий:

* 1. Открыть ключ (OpenKey())
* 2. Прочитать или записать данные
* 3. Закрыть ключ (CloseKey()), в принципе деструктор класса Tregistry может закрыть ключ сам, но это поможет при одиночном или последнем чтении.

Чтение из реестра:

TRegistry RegKey = *new TRegistry();

bool keyGood = RegKey.OpenKey("C++Builder Test", false);

if (!keyGood) return;

int top = RegKey.ReadInteger("Top");

int left = RegKey.ReadInteger("Left");

int width = RegKey.ReadInteger("Width");

int height = regKey.ReadInteger("Height");

delete RegKey;


Объявление RegKey – это указатель –тип ссылки.
Смена корневого ключа производится свойством RootKey, например
regKey.RootKey="HKEY_CLASSES_ROOT";
Обращение к параметру ключа по «умолчанию» производится указанием вместо параметра ключа пустой строки:
WS=RegKey.ReadString("");
   Код позволяет сохранять позицию формы в системном реестре и потом создавать ее в той позиции, в которой она была при закрытии.


^  Запись позиции окна приложения в реестре:

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

void __fastcall TMainForm::FormCreate(TObject *Sender)

{

//Запись в реестр

TRegistry & RegKey = *new TRegistry();

RegKey.OpenKey("SOFTWARE\\MyApp\\FormPos\\MainForm", true);

if (RegKey.ValueExists("Top"))

{

temp = RegKey.ReadInteger("Top"); MainForm->Top = temp;

}

if (RegKey.ValueExists("Left"))

{

temp = RegKey.ReadInteger("Left"); MainForm->Left = temp;

}

if (RegKey.ValueExists("Width"))

{

temp = RegKey.ReadInteger("Width");

MainForm->Width = temp;

}

if (RegKey.ValueExists("Height"))

{

temp = RegKey.ReadInteger("Height");

MainForm->Height = temp; ...

^

Запись и чтение настроек в INI-файлах


  Еще одним способом сохранять настройки является запись в ini файлы. Итак, ini-файл имеет простую и понятную структуру:

[Секция1]

Идентификатор1 = Значение1

Идентификатор2 = Значение2

[Секция2]

Идентификатор1 = Значение1

Для использования ini-файлов, в C++Builder предусмотрен модуль IniFiles, его мы и подключаем:

#include IniFiles.hpp

Далее, нужно создать обьект класса TIniFile, назовем его Ini.
После

TForm1 *Form1;

пишем:

TIniFile *Ini = new TIniFile("c:/options.ini");

значения сохраняет на диске С: в файл options.ini .

  После этого, на форму кинем две кнопки (^ TButton) и два Эдита (TEdit). Мы будем сохранять текст Эдитов в ini-файл, а потом загружать его.
Пишем обработчик события нажатия кнопки Button1. Она будет сохранять текст Эдитов в наш options.ini

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Ini->WriteString("Edits","Edit1",Edit1->Text);

Ini->WriteString("Edits","Edit2",Edit2->Text);

}

Так, как мы работаем с текстом, мы использовали метод класса WriteString,
если нам нужно было бы работать с числами, мы бы написали WriteInteger .

Где параметры для этой функции:
"Edits" - имя секции;
"Edit1" - указатель на объект;
"Edit1->Text" - строка, которую мы сохраняем (текст эдита).

Далее, рассмотрим пример загрузки параметров с ini , пишем обработчик события для второй кнопки:

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Edit1->Text = Ini->ReadString("Edits","Edit1","Def");

Edit2->Text = Ini->ReadString("Edits","Edit2","Def");

}

Здесь используем функцию чтения :ReadString , где:
"Edits" - секция из которая нам надо ;
"Edit1" - объект для которого загружаем строку;
"Def" - эта строка заполняет Эдит, если значение ini не найдено;

  Этот маленький пример показывает как можно легко загружать и сохранять параметры Вашей программы в ^ INI-файлы.

Ход работы
Задание
Создать тестовое приложение для установки и удаления программы.
Порядок выполнения работы


    1. Создайте новое приложение File|New|Application.

    2. Перенесите на форму три кнопки Button (вкладка Standard) и диалог (вкладка Dialogs) FontDilog.

    3. Первую кнопку назовем BInst и зададим надпись Install. Эта кнопка будет имитировать установку программы. Вторая кнопка - BUnInst c надписью UnInstall, для имитации удаления программы. Третья кнопка – BFont c заданной надписью Font будет позволять изменять имя шрифта, используемого в форме, и обеспечит запоминание этого шрифта в реестре.









    1. Теперь переходим к написанию кода программы, предварительно установив для формы два события: OnDestroy и OnCreate.



#include

#pragma hdrstop

#include // Подключаем библиотеку

#include "Unit1.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

TRegistry *Reg = new TRegistry;

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

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}
void __fastcall TForm1::FormDestroy(TObject *Sender)

{

delete Reg;

}

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

void __fastcall TForm1::FormCreate(TObject *Sender)

{

Reg->RootKey = HKEY_LOCAL_MACHINE;

if (Reg->KeyExists("\\Software\\A Projects\\P1"))

{ Reg->OpenKey("\\Software\\A Projects\\P1", true);

Font->Name = Reg->ReadString("Шрифт");

}

}

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

void __fastcall TForm1::btInstallClick(TObject *Sender)

{

Reg->OpenKey("\\Software\\A Projects\\P1", true);

Reg->WriteString("Тема","Мои приложения");

Reg->OpenKey("\\Software\\A Projects\\P1", true);

Reg->WriteString("Приложения","TRegistry");

Reg->WriteString("Файл",ParamStr(0));

Reg->WriteString("Шрифт",Form1->Font->Name);

}

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

void __fastcall TForm1::btUnInstClick(TObject *Sender)

{

Reg->DeleteKey("\\Software\\A Projects\\P1");

}

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

void __fastcall TForm1::btFontClick(TObject *Sender)

{

FontDialog1->Font->Assign(Font);

// Запоминание в реестре имени шрифта

if (FontDialog1->Execute())

{

Font->Assign(FontDialog1->Font);

if (Reg->OpenKey("\\Software\\A Projects\\P1", false))

//Запись имени шрифта только если имеется раздел P1

Reg->WriteString("Шрифт",Form1->Font->Name);

}

}

Сохраните тестовое приложение и запустите его на выполнение. Нажмите Install. После этого запустите программу Regedit.exe и посмотрите реестр. Вы увидите там свои ключи и параметры.



    1. Щелкните на кнопке UnInstall. Вернитесь в окно Regedit.exe и выберете в нем команду Вид|Обновить. Вы увидете, что ключ Р1 вместе со всеми своими параметрами исчез из дерева. Опять нажмите кнопку Install, а затем нажмите кнопку Font и выберете шрифт с каким-нибудь другим именем. В окне Regedit.exe вы можете увидеть, что значение параметра Шрифт изменится.

    2. Закройте свое приложение и запустите его повторно. Вы увидете, что на форме применен тот шрифт, который вы зарегистрировали в реестре. Таким образом, приложение проимитировало установку программы, снятие программы с регистрации и запоминание текущих настроек в реестре.

    3. Когда вы закончите экспериментировать, удалите с помощью Regedit.exe из реестра ваш ключ A Projects, поскольку приложение удаляло только его субключ Р1.



Задание 2
Установить программу, запомнить ее настройки и удалить программы с помощью .ini файлов
Порядок выполнения работы:


    1. Создайте простое тестовое приложение, аналогичное рассмотренному в задании 1 (п.1-3).

    2. В закладке выбираем Dialogs компоненту FontDialogs и переносим ее на форму. Нам она понадобиться, чтобы изменять параметры шрифта.

    3. Далее запишем код программы соответственно для события OnCreate, для события OnDestroy, для кнопок Install, Uninstall, Font .


#include

#pragma hdrstop

#include // Подключаем библиотеку inifiles.hpp

#include "Unit1.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

TIniFile *Ini;

//String sFile;

String path;

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

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}

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

void __fastcall TForm1::FormCreate(TObject *Sender)

{

//Формирование имени файла в текущем каталоге

path = GetCurrentDir();
//Создание объекта Ini

Ini = new TIniFile (path+"\\My.ini");
if (FileExists(path+"\\My.ini") && Ini->ValueExists("Ïàðàìåòðû", "Øðèôò"))

{

// Чтение в имя шрифта формы значения ключа Шрифт

Font->Name = Ini ->ReadString ("Параметры", "Шрифт", "MS Sans Serif");

}

}

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

void __fastcall TForm1::FormDestroy(TObject *Sender)

{

if (Ini == NULL) return;

// Очистка буфера и запись файла на диск

Ini ->UpdateFile ();

//Освобождение памяти

delete Ini;

}

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

void __fastcall TForm1::btFontClick(TObject *Sender)

{

//Выбор шрифта

FontDialog1->Font->Assign(Font);

if (FontDialog1->Execute())

{

//Присваивание выбранного шрифта форме

Font->Assign (FontDialog1->Font);

}

}

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

void __fastcall TForm1::btInstClick(TObject *Sender)

{

//Запись шрифта в ключ «Шрифт», разделе «Параметры»

Ini->WriteString ("Параметры ","Шрифт ", Font->Name);

}

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

void __fastcall TForm1::btUnInstClick(TObject *Sender)

{

//Удаление с диска файла .ini, если он существует

if (FileExists (path+"\\My.ini"))

DeleteFile (path+"\\My.ini");

}

3. Сохраните свое тестовое приложение и запустите его на выполнение. Нажмите кнопку Install. После этого убедитесь в наличии файла “My.ini” в текущем каталоге.

Добавить документ в свой блог или на сайт

Похожие:

Лабораторная работа №2 Тема: Работа с системным реестром в C++ Builder (Класс tregistry). Ini файлы iconЛабораторная работа по теме «Тема 10. Лабораторная работа «Текстовые файлы»
Цель лабораторной работы состоит в изучении средств vb и средств vs для работы с текстовыми файлами

Лабораторная работа №2 Тема: Работа с системным реестром в C++ Builder (Класс tregistry). Ini файлы iconЛабораторная работа № Лабораторная работа №3 Тема: «Работа с панелью...
Основные приемы работы(контекстное меню, выделение, группирование объектов, перетаскивание мышью, получение справки)

Лабораторная работа №2 Тема: Работа с системным реестром в C++ Builder (Класс tregistry). Ini файлы iconЛабораторная работа №2 Тема: «Работа с таблицами и формулами» Тема:...
Способы создания простой и сложной таблиц( разбиение, объединение ячеек, добавление и удаление ячеек, строк, столбцов)

Лабораторная работа №2 Тема: Работа с системным реестром в C++ Builder (Класс tregistry). Ini файлы iconЛабораторная работа №5. Генерация отчетов в субд access лабораторная...
Лабораторная работа №3. Изменения экранного образа таблицы в субд access лабораторная работа №4. Простые и сложные запросы к базе...

Лабораторная работа №2 Тема: Работа с системным реестром в C++ Builder (Класс tregistry). Ini файлы iconЛабораторная работа №2 Тема: Обработка одномерных массивов
Написать и отладить программу с использованием одномерных массивов. Изучить основные возможности работы со стандартными компонентами...

Лабораторная работа №2 Тема: Работа с системным реестром в C++ Builder (Класс tregistry). Ini файлы iconЛабораторная работа 3 (2003). Тема : Работа с буфером обмена. Создание...
Тема: Работа с буфером обмена. Создание списков. Работа с изображениями в текстовых документах

Лабораторная работа №2 Тема: Работа с системным реестром в C++ Builder (Класс tregistry). Ini файлы iconЛабораторная работа по Microsoft Excel №4 Тема: Управление листами. Работа со списками
В поле Перед листом выберите лист, перед которым нужно вставить перемещаемые или копируемые листы

Лабораторная работа №2 Тема: Работа с системным реестром в C++ Builder (Класс tregistry). Ini файлы iconЛабораторная работа выполняется по темам: «Оптимизационные экономико-математические...
Лабораторная работа выполняется и защищается в соответствии с утвержденным расписанием занятий

Лабораторная работа №2 Тема: Работа с системным реестром в C++ Builder (Класс tregistry). Ini файлы iconЗакон Ома для участка цепи без эдс. Сопротивление проводника. Падение...
Лабораторная работа: «Измерение длины световой волны с помощью дифракционной решётки»

Лабораторная работа №2 Тема: Работа с системным реестром в C++ Builder (Класс tregistry). Ini файлы iconЛабораторная работа 14
Создание шаблона. Работа с шаблонами документов. Совместное использование Word и Excel

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
zadocs.ru
Главная страница

Разработка сайта — Веб студия Адаманов