![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
THandle |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 65 Всего: 372 |
TRegistry. Работа с реестром Windows в Delphi.
Что такое реестр Windows? Реестр Windows – это иерархически построенная база настроек и параметров операционной системы Windows. Реестр содержит в себе настройки программ, информацию об аппаратном обеспечении компьютера, индивидуальные настройки профилей пользователей Windows. Почти все данные реестра находятся в основном на винчестере компьютера. Реестр состоит из следующих разделов: HKEY_CURRENT_USER HKEY_USERS HKEY_LOCAL_MACHINE HKEY_CLASSES_ROOT HKEY_CURRENT_CONFIG HKEY_DYN_DATA(этот раздел имеется только в Windows 9X/Me, поэтому мы его рассматривать не будем). HKEY_PERFORMANCE_DATA Теперь более подробно рассмотрим каждый раздел, и что он в себе хранит. HKEY_CURRENT_USER В этом разделе реестра хранятся настройки текущего пользователя Windows. Является подразделом HKEY_USERS. HKEY_USERS В данном разделе хранятся настройки всех активных пользователей системы. HKEY_LOCAL_MACHINE В этом разделе хранятся настойки конфигурации компьютера, относящиеся ко всем пользователям. HKEY_CLASSES_ROOT Этот раздел является подразделом HKEY_LOCAL_MACHINE\Software\Classes. В нем хранится информация о зарегистрированных типах файлов, а также об объектах COM и ActiveX. HKEY_CURRENT_CONFIG В этом разделе содержится информация о профиле оборудования, используемом локальным компьютером при запуске системы. HKEY_PERFORMANCE_DATA В этом разделе реестра хранятся счетчики производительности системы, и еще довольно большое количество подобной информации. В редакторе реестра (regedit) этот раздел не отображается. Данные этого раздела реестра хранятся не на винчестере, а в памяти компьютера. Более подробную информацию о разделах реестра можно найти на сайте Microsoft: http://support.microsoft.com/kb/256986/en-us Реестр состоит из так называемых ульев(hive, иногда переводят на русский как «куст»), которые являются множеством разделов и параметров(ключей) реестра. В Delphi работа с реестром Windows осуществляется с помощью класса TRegistry, находящегося в модуле Registry. Класс TRegistry является прямым наследником от класса TObject. Теперь рассмотрим свойства и методы класса TRegistry. Методы Create. 1. Объявлен как:
Создаёт объект класса TRegistry для работы с реестром Windows. Свойству Access присваивается значение KEY_ALL_ACCESS. Пример:
2. Объявлен как:
Создает объект класса TRegistry, устанавливает свойство Access в значение параметра AAccess. Пример:
Свойство Access. Объявлено как:
Свойство Access используется для указания уровня безопасности при открытии ключей реестра. Возможны следующие значения: KEY_QUERY_VALUE Это значение свойства Access разрешает чтение данных из ключей реестра. KEY_ENUMERATE_SUB_KEYS Разрешает нумерацию ключей реестра. KEY_NOTIFY Данное значение предоставляет возможность получать уведомления об изменениях в реестре. KEY_SET_VALUE Разрешает запись данных в реестр. KEY_CREATE_SUB_KEY Разрешает создание подключей. KEY_CREATE_LINK Разрешает создание символической ссылки. KEY_READ Комбинация значений: KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, KEY_NOTIFY. KEY_WRITE Комбинация двух значений: KEY_SET_VALUE и KEY_CREATE_SUB_KEY. KEY_EXECUTE Разрешает доступ только для чтения. Равняется KEY_READ. KEY_ALL_ACCESS Комбинация следующих значений: KEY_READ, KEY_WRITE, KEY_CREATE_LINK. Свойство RootKey. Объявлено как:
Используется для указания корневого раздела реестра. При создании объекта класса TRegistry этому свойству присваивается значение HKEY_CURRENT_USER. Пример:
Метод CreateKey. Объявлен как:
Функция CreateKey создает в реестре ключ Key. Если создание ключа прошло успешно функция вернет true, иначе будет поднято исключение ERegistryException, поэтому настоятельно рекомендую все вызовы CreateKey заключать в блоки try..except(finally). Пример:
Метод OpenKey. Объявлен как:
Функция OpenKey открывает ключ Key. Если CanCreate равно true, то если ключ, указанный в Key не найден, то он будет создан. Функция вернет true, если открытие ключа прошло успешно. Пример:
Метод OpenKeyReadOnly. Объявлен как:
Открывает ключ Key только для чтения, со значением свойства Access равному KEY_READ. Функция возвращает true, если ключ удалось открыть. Пример:
Свойства CurrentKey и CurrentPath. Объявлены как:
Свойство CurrentKey содержит в себе дескриптор ключа реестра, который в данный момент открыт. Изменяется при вызове методов OpenKey и OpenKeyReadOnly. Данное свойство записи не подлежит, то есть, является read-only свойством. Если Вы не выходите за рамки действия созданного экземпляра TRegistry, то это свойство Вам вряд ли понадобится. Свойство CurrentPath содержит путь к ключу реестра, который в данный момент открыт. Аналогично CurrentKey это read-only свойство. CurrentPath автоматически изменяется при открытии другого ключа. Пример: По нажатию кнопки появляется сообщение с информацией о текущем открытом ключе реестра.
Методы WriteString, ReadString. Объявлены как:
Процедура WriteString пишет в открытый ключ реестра(CurrentPath) параметр с именем Name и строковым значением Value. Функция ReadString читает из открытого ключа параметр с именем Name. Если ключ не найден, то функция вернет пустую строку, иначе, прочитанное из реестра строчное значение. Пример: По нажатию первой кнопки пишем в реестр строковый параметр, а при нажатии на вторую кнопку его читаем и показываем в сообщении.
Метод WriteExpandString. Объявлен как:
Процедура аналогична WriteString, только пишет в реестр так называемые «широкие»(не путать с Unicode!) строки, которые чаще всего описывают переменные окружения Windows, например "%PATH%". Пример: См. Пример к методам WriteString/ReadString. Методы WriteInteger, ReadInteger. Объявлены как:
Процедура WriteInteger пишет в открытый ключ реестра параметр с именем Name и целочисленным значением Value. Функция ReadInteger читает из открытого ключа параметр с именем Name. Если ключ не найден, то будет поднято исключение типа ERegistryException, иначе, прочитанное из реестра целочисленное значение. Пример: См. Пример к методам WriteString/ReadString. Методы WriteFloat, ReadFloat. Объявлены как:
Процедура WriteFloat пишет в открытый ключ реестра параметр с именем Name и значением в виде натурального числа Value. Функция ReadFloat читает из открытого ключа параметр с именем Name. Если ключ не найден, то будет поднято исключение типа ERegistryException, иначе, прочитанное из реестра натуральное число. Пример: См. Пример к методам WriteString/ReadString. Методы WriteBool, ReadBool. Объявлены как:
Процедура WriteBool пишет в открытый ключ реестра параметр с именем Name и булевым значением Value. Функция ReadBool читает из открытого ключа параметр с именем Name. Если ключ не найден, то будет поднято исключение типа ERegistryException, иначе, прочитанное из реестра булево значение. Пример: См. Пример к методам WriteString/ReadString. Методы WriteCurrency, ReadCurrency. Объявлены как:
Процедура WriteCurrency пишет в открытый ключ реестра параметр с именем Name и денежным значением Value. Функция ReadCurrency читает из открытого ключа параметр с именем Name. Если ключ не найден, то будет поднято исключение типа ERegistryException, иначе, прочитанное из реестра денежное значение. Пример: См. Пример к методам WriteString/ReadString. Методы WriteDate, ReadDate. Объявлены как:
Процедура WriteDate пишет в открытый ключ реестра дату с именем Name. Функция ReadDate читает из открытого ключа параметр с именем Name. Если ключ не найден, то будет поднято исключение типа ERegistryException, иначе, функция вернет прочитанную дату. Пример: См. Пример к методам WriteString/ReadString. Методы WriteTime, ReadTime. Объявлены как:
Процедура WriteTime пишет в открытый ключ реестра параметр со значением типа время и с именем Name. Функция ReadTime читает из открытого ключа параметр с именем Name. Если ключ не найден, то будет поднято исключение типа ERegistryException, иначе, функция вернет прочитанное время. Пример: См. Пример к методам WriteString/ReadString. Методы WriteDateTime, ReadDateTime. Объявлены как:
Процедура WriteDateTime пишет в открытый ключ реестра параметр с именем Name и значением в виде дата + время. Функция ReadDateTime читает из открытого ключа параметр с именем Name. Если ключ не найден, то будет поднято исключение типа ERegistryException, иначе, функция вернет прочитанную дату и время. Примечание: На самом деле методы WriteDate, ReadDate, WriteTime, ReadTime просто вызывают в своём теле Write(Read)DateTime с соответствующими параметрами. Пример: См. Пример к методам WriteString/ReadString. Это сообщение отредактировал(а) THandle - 13.3.2008, 17:29 |
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
THandle |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 65 Всего: 372 |
Методы WriteBinaryData, ReadBinaryData.
Объявлены как:
Процедура WriteBinaryData записывает в открытый на данный момент ключ реестра в параметр с именем Name данные в HEX виде из буфера Buffer, размером BufSize. При ошибке записи будет поднято исключение ERegistryException. Функция ReadBinaryData читает из открытого в данный момент ключа шестнадцатеричные данные размером BufSize из параметра с именем Name в буфер Buffer. Размер буфера должен быть больше или равен размеру читаемых данных, иначе будет возбуждено исключение типа ERegistryException. Результатом работы функции является размер прочитанных данных. Пример: По нажатию первой кнопки в реестр пишется массив байт, а по нажатию второй – читается оттуда.
Метод DeleteKey. Объявлен как:
Удаляет ключ, указанный в Key, а также все подключи и параметры из него. Если всё прошло успешно функция вернет true, иначе false. Пример:
Метод DeleteValue. Объявлен как:
Удаляет из текущего открытого ключа параметр Name. Если всё прошло успешно то функция вернет true, иначе false. Пример:
Метод GetKeyInfo. Объявлен как:
С помощью этой функции можно получить информацию о текущем ключе. Единственный параметр функции Value представляет собой следующую структуру:
После вызова функция вернет true в случае успеха и занесет всю нужную информацию в переданную в параметре Value структуру, иначе вернет false. Теперь разберем, что представляет из себя структура TRegKeyInfo, и для чего нужны её поля: NumSubKeys Количество подключей. MaxSubKeyLen Максимальная длина имени подключа. NumValues Количество параметров. MaxValueLen Максимальная длина имени параметра. MaxDataLen Максимальный размер записанных данных. FileTime Время последнего обновления ключа. Пример:
Метод GetDataInfo. Объявлен как:
Получает информацию о параметре с именем ValueName. Заносит её в структуру Value типа TRegDataInfo.
Поле структуры RegData представляет из себя следующий тип:
Теперь о возможных значениях типа TRegDataType. rdUnknown Неизвестный тип. rdString Строка. rdExpandString «Широкая» строка (см. метод WriteExpandString). rdInteger Целое число. rdBinary Любые двоичные данные(записываемые например процедурой WriteBinaryData). Нужен этот тип для определения типа записанных в параметре данных. Второе поле структуры TRegDataInfo – DataSize. Это размер значения параметров в байтах. Пример:
Метод GetDataSize. Объявлен как:
Узнает размер значения параметра реестра с именем ValueName. Возвращает размер в байтах. На самом деле эта функция просто вызывает в своем теле GetDataInfo и возвращает параметр DataSize структуры TRegDataInfo. Пример: См. пример к методу GetDataInfo. Метод GetDataType. Объявлен как:
Вызывает функцию GetDataInfo, для параметра ValueName, и возвращает поле RegData структуры TRegDataInfo. Пример: См. пример к методу GetDataInfo. Метод RenameValue. Объявлен как:
Переименовывает ключ OldName в NewName. Значение параметра остается прежним. Примечание: на самом деле просто создается новый ключ, и в него копируется значение из старого, после чего последний удаляется. Для выполнения функции необходимо наличие ключа OldName. Пример:
Метод GetKeyNames. Объявлен как:
Записывает в параметр Strings имена всех подключей текущего открытого ключа. Пример: Положите на форму кнопку и TMemo. OnClick кнопки:
В результате в Memo1 получим следующий список:
Метод GetValueNames. Объявлен как:
Получает список всех параметров текущего ключа и заносит их в Strings. Параметры подключей в список не включаются. Пример: См. Пример к методы GetKeyNames. Метод HasSubKeys. Объявлен как:
Эта функция проверяет наличие подключей в текущем открытом ключе. Если хоть один подключ существует, то функция вернет true, иначе false. Примечание: на самом деле функция HasSubKey вызывает в своем теле метод GetKeyInfo, и если она в структуре TRegKeyInfo возвращает поле NumSubKeys, которое больше 0, то тогда HasSubKey и возвращает true. Метод KeyExists. Объявлен как:
Проверяет наличие ключа по указанному в Key пути. Если ключ существует, то вернет true, иначе вернет false. Пример:
Примечание к примеру: в нашем случае всегда будет показано сообщение о том, что ключ найден, так как перед вызовом KeyExists мы его создаем. Метод ValueExists. Объявлен как:
Проверяет наличие параметра с именем Name в текущем открытом ключе. Если параметр существует, то функция вернет true, иначе вернет false. Пример: См. Пример к методу KeyExists. Метод CloseKey. Объявлен как:
CloseKey записывает измененные данные, после чего закрывает текущий ключ. Некоторые методы чтения / записи вызывают в себе CloseKey сразу после произведенных действий. Примечание: Ключ реестра следует закрывать сразу же как с ним проведены все необходимые действия. Не держите ключ подолгу открытым. Лучше закройте его, а когда он потребуется, вновь откройте. Свойство LazyWrite. Объявлено как:
LazyWrite используется для указания того, как ключи должны быть записаны в реестр. При создании объекта TRegistry это свойство равно true. Если LazyWrite истинно(true), то система сама решает, когда лучше записать данные на диск. Сначала все данные помещаются в оперативную память. Когда LazyWrite равняется false, ключи записываются на диск немедленно, что может достаточно сильно нагрузить систему, поэтому я советую вам использовать LazyWrite(false) только в самых крайних случаях. Метод MoveKey. Объявлен как:
Переносит ключ OldName, все его подключи и параметры в ключ NewName. Процедура сойдает новый ключ(NewName) и рекурсивно переносит в него все подключи и параметры из OldName. Если Delete равняется true, то старый ключ будет удален, иначе он останется на своём месте. Пример:
Примечание: в данном случае будет произведено просто копирование ключа, так как параметр Delete указан как false. Метод SaveKey. Объявлен как:
Сохраняет все подключи и параметры ключа Key в файл FileName в виде улья. Файл FileName не должен существовать. Метод LoadKey. Объявлен как:
Создает ключ Key в корне(свойство RootKey) реестра, и записывает в него улей из файла FileName. В качестве RootKey можно указывать только HKEY_USERS и HKEY_LOCAL_MACHINE, так как остальные разделы реестра являются лишь их частями. В случае удачи функция вернет true, иначе false. При перезагрузке системы ключ теряется, но до этого может быть удален только функцией UnLoadKey. Метод UnLoadKey. Объявлен как:
Удаляет из реестра ключ Key, ранее созданный методом LoadKey. Метод ReplaceKey. Объявлен как:
Заменяет указанный в Key ключ, все его подключи и параметры содержимым файла FileName. Ключ Key сохраняется в файл с именем BackUpFileName. Замена происходит только после перезагрузки системы. Функция возвращает true, если всё прошло удачно и false, если что-то не получилось. Метод RestoreKey. Объявлен как:
Загружает в указанный ключ Key содержимое файла FileName. Все подключи и параметры ключа Key буду заменены прочитанными из файла данными. При удачной загрузке функция вернет true, иначе false. Метод RegistryConnect. Объявлен как:
Используется для соединения с реестром другого компьютера. Параметр UNCName – имя удаленного компьютера. Должно иметь следующий вид:
Перед тем как вызвать RegistryConnect, необходимо установить свойство RootKey в одно из двух значений: HKEY_USERS HKEY_LOCAL_MACHINE Если удалось подключится, то функция установит свойство RootKey в значение этого же свойства на удаленном компьютере и вернет true, иначе свойство RootKey останется в том же виде в котором вы его оставили, и функция вернет false. Полезные ссылки(обещаю по мере нахождения их в интернете добавлять сюда): Узнать значение параметра по умолчанию у ключа реестра Хочу так же выразить благодарность Rrader'у, за полезные замечания по поводу статьи. По просьбе трудящихся прикрепляю .doc файл. Это сообщение отредактировал(а) THandle - 4.5.2008, 19:44 Присоединённый файл ( Кол-во скачиваний: 164 ) ![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Молодец!))
![]() |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: нет Всего: 162 |
^)))
|
|||
|
||||
Lexicss |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 16.8.2006 Где: Беларусь, Минск Репутация: нет Всего: 1 |
Я ещё ни в одной книге по Delphi не находил похожий статей. На мой взгял довольно полезная. Спасибо THandleru. ;)
--------------------
Бери от жизни всё. |
|||
|
||||
Dronchik |
|
|||
![]() Звукач ёмаё ![]() ![]() Профиль Группа: Участник Сообщений: 451 Регистрация: 1.5.2007 Репутация: нет Всего: 37 |
Отличная статья +1
-------------------- Вместо слов делай дело, от которого ты фанатеешь. (с) |
|||
|
||||
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 65 Всего: 372 |
Всем спасибо
![]() ![]() ЗЫ: Если найдете какие-то ошибки, неточности, опечатки и тд., то пожалуйста пишите в PM или в ICQ. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
вот это сбивает с толку. Под широкой строкой обычно имеется в виду уникод. А тут речь о строках нуждающихся в вызове ExpandEnvironmentString -------------------- Обижено школьников: 8 |
|||
|
||||
Ofer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 293 Регистрация: 15.10.2006 Где: КривбаСС Репутация: 1 Всего: 5 |
Прелестно.... просто замечательно.... +1
|
|||
|
||||
Erazer |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 1.6.2008 Репутация: -1 Всего: -1 |
Кто нить может подсказать как заставить работать
Reg := TRegistry.Create(KEY_READ); Try Reg.SaveKey('Software\Microsoft\Windows Mail',TmpFolder + '\WMailReg1.reg'); Finally Reg.Free; End; в Vista без прав админа ? С импотром та же шняга - права админа и все тут :-( |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Erazer, я не вижу, с каким разделом реестра работаешь? Какая ошибка, конкретнее? И убери отсюда все свои шняги, ПОНЯЛ? И темы не плоди.
|
|||
|
||||
agent13 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 9.6.2007 Репутация: нет Всего: нет |
Помогите пожалуйста надо создать ключи типа Dword и Binary. Подскажите как это реализовать в Delphi.
|
|||
|
||||
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 65 Всего: 372 |
agent13, ну зачем поднимать старые темы, а тем более статьи??? Правила форума читал?
Используй WriteInteger, WriteBinaryData. Пример(хотя выше они есть):
|
|||
|
||||
agent13 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 9.6.2007 Репутация: нет Всего: нет |
а поподробнее про WriteBinaryData('Param2', A, SizeOf(A)); объясните. Я непонял. Что за А и SizeOf(A).
|
|||
|
||||
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 65 Всего: 372 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |