Описание вспомогательных, если их можно так назвать, полей и методов. Это те поля и методы которые находятся в личной (private) и защищенной (protected) секции класса. Они не доступны вашей программе, а только методам самого класса или его потомка (для protected). Однако ими интенсивно пользуются доступные методы.
Из файла Source\RTL\WIN\windows.pas:
Из файла Source\VCL\registry.pas:
protected
public
end;
function IsRelative const Value:string):Boolean;
Закрывает текущий ключ и готовится к открытию нового ключа.
end;
С помощью метода CloseKey освобождается дескриптор текущего ключа, а поля FCurrentKey и FCurrentPath заполняются новыми значениями.
Возвращает дескриптор ключа, от которого читается путь.
end;
Возвращает дескриптор ключа. При этом для ключа, начинающегося с символа '\' (слеш означает, что имя ключа абсолютно, т.е. считается от корневого ключа), выбирается дескриптор корневого ключа. Иначе (ключ относительный) дескриптор текущего ключа (открытого в данный момент).
Читает из текущего ключа значение параметра в буфер. Если параметр с указанным именем отсутствует, то возбуждает исключение.
end;
var
DataType: Integer;
end;
Вызывается функция RegQueryValueEx для текущего ключа и указанного имени параметра. Кроме того, передаются указатели на: переменную принимающую значение типа данных, буфер принимающий сами данные и переменную сообщающую длину буфера, причем по возвращению она примет значение длины скопированных в буфер данных (для строковых с учетом терминального нуля). После окончания функции RegData заполняется с помощью функции преобразования DataTypeToRegData потому, что значения типов для Windows и Delphi не полностью совпадают (например, REG_BINARY = 3, а rdBinary = 4). В случае успеха функция GetData возвращает значение длины полученных данных. При отсутствии параметра с указанным именем или в случае любой другой неудачи вызывается исключение.
Обратите внимание, сами данные принимаются, функцией GetData, через переменную Buffer, как не типизированная последовательность байт длиной BufSize, а тип данных передается отдельно. Такое решение позволяет с помощью одной функции читать данные (значение параметра) любого типа.
Записывает в текущий ключ значение параметра из буфера. Если параметр с указанным именем не существует, то создает его.
end;
end;
Вызывает функцию RegSetValueEx для текущего ключа и транслирует в нее тип данных параметра, адрес буфера содержащего эти данные (значение параметра) и размер этих данных. Если функция завершается с ошибкой, то вызывается исключение.
Обратите внимание, сами данные передаются, в процедуру PutData, через переменную Buffer, как не типизированная последовательность байт длиной BufSize, а тип данных передается отдельно. Такое решение позволяет с помощью одной процедуры записывать данные (значение параметра) любого типа.
Открывает ключ по указанному пути и возвращает его дескриптор.
end;
Определяется относительность пути и в случае если он абсолютный, удаляется лидирующий слеш, потому, что для функций Windows требуется относительный путь. С помощью функции RegOpenKeyEx делается попытка открыть ключ, т.е. получить дескриптор в переменой Result, с полным доступом, если не удачно, то хотя бы на чтение.
Назначает указанный дескриптор ключа в качестве текущего.
end;
Дескриптор записывается в поле FCurrentKey и, при очередном открытии файла, будет использоваться как текущий ключ.
Устанавливает новый корневой каталог.
end;
FRootKey := Value;
CloseKey;
end;
end;
Проверяет, отличается ли дескриптор нового ключа от старого и если отличается, то приступает к переназначению, иначе заканчивается. Поле FCloseRootKey имеет значение True если подключен реестр удаленного компьютера и в этом случае необходимо закрыть этот дескриптор. Далее устанавливается новое значение дескриптора корневого ключа и закрывается (освобождается) дескриптор текущего ключа.
И еще одна самостоятельная функция, описанная в исполняемой части модуля Registry и потому не доступная за его пределами.
Определяет, является ли указанный путь относительным.
end;
Принимает значение True, если строка пустая или первый символ не равен слеш ('\').
Подробное описание доступных (public) методов. Все они находятся в доступной секции класса.
Methods Методы
Закрывает дескриптор текущего ключа и очищает свойства CurrentKey и CurrentPath.
FCurrentKey := 0;
FCurrentPath := '';
end;
end;
Если ключ еще не закрыт, то он закрывается в зависимости от значения LazyWrite. При этом, если LazyWrite равно True, ключ закрывается с отложенной записью на диск (может быть несколько секунд), иначе немедленно (естественно запись на диск происходит в случае модификации ключа) и освобождается память, занятая ключом. Поля FCurrentKey и FCurrentPath очищаются. Функция RegCloseKey записывает данные в кэш оперативной памяти и возвращает управление программе, а реальную запись на диск производит операционная среда позже, в фоновом режиме. В отличие от нее функция RegFlushKey не возвращает управления программе до тех пор, пока не закончится операция физической записи на диск. По этому функция RegFlushKey сильно замедляет выполнение программы, и пользоваться ей надо только в случае крайней необходимости. Для нас это означает, что LazyWrite, по возможности, должна иметь значение True.
Создает ключ по указанному пути.
end;
Дескриптор временного ключа TempKey обнуляется. Определяется относительность пути и в случае если он абсолютный удаляется лидирующий слеш. Дело в том, что сам-то Windows оперирует относительными путями. Вызывается функция RegCreateKeyEx с соответствующими параметрами и в предпоследнем из них возвращается дескриптор созданного и открытого ключа. В связи с тем, что TRegistry придерживается мнения, что открытым должен быть только один ключ (в целях экономии ресурсов), метод CreateKey в случае удачного создания нового ключа закрывает его и возвращает True. В случае неудачи возбуждает исключение. Таким образом, возвращаемым значением метода CreateKey может быть только True, потому что иначе возбуждается исключение. Из этого следует, что если вы будете создавать ключи, то будьте готовы обрабатывать исключения.
В последнем параметре функции RegCreateKeyEx возвращается значение, которое определяет, был ли действительно создан ключ или только открыт существующий, но это значение, как видите, не используется, и узнать сей факт не возможно. Кроме того, у функции есть еще, по крайней мере, два очень интересных параметра, но ими TRregisry не дает управлять. Один из них, пятый в функции, позволяет создавать так называемые энергозависимые (volatile - к сожалению, не знаю как по-русски) ключи, которые не сохраняются после перезагрузки системы. Правда Windows95 не поддерживает такие ключи и видимо по этому метод CreateKey создает только энергонезависимые ключи, которые сохраняются после перезагрузки системы.
Удаляет ключ и все его подключи, по указанному пути.
Определяется относительность пути и в случае если он абсолютный удаляется лидирующий слеш. Дело в том, что сам-то Windows оперирует относительными путями.
Во временной переменной OldKey запоминается текущий ключ, чтобы потом его восстановить и открывается ключ, подлежащий удалению (дескриптор этого ключа в переменной DeleteKey). Если операция прошла успешно, переходим в защищенный блок.
end;
end;
Устанавливаем ключ, подлежащий удалению как текущий ключ. Данный не хитрый ход приходится применять только потому, что метод GetKeyInfo возвращает сведенья о текущем ключе. Если вызов этого метода проходит успешно, а сведения возвращаются в переменной Info, то переходим к перебору всех подключей. Но сначала создаем строку KeyName длиной равной длине самого длинного имени подключа. Далее запрашиваем имя очередного подключа (функция RegEnumKeyEx) и рекурсивно вызываем метод DeleteKey для удаления всех подключей перед удалением основного ключа. Таким образом, метод DeleteKey вызывается для каждого подключа уровней ниже основного, до тех пор, пока не будут удалены все вложенные подключи.
end;
Result := RegDeleteKey(GetBaseKey(Relative), PChar(S)) = ERROR_SUCCESS;
end;
После удаления всех подключей восстанавливается старый текущий ключ (переменная OldKey) и закрывается ключ, предназначенный на удаление. И на конец с помощью функции RegDeleteKey удаляется только что закрытый ключ, который и требовалось удалить.
Интересно то, что в Windows95 функция RegDeleteKey сама удаляет все подключи, а алгоритм, реализованный в данном методе, рекомендован для WindowsNT.
Удаляет параметр с указанным именем (и имя и значение) для текущего ключа.
end;
Вызывает функцию RegDeleteValue для текущего ключа и передает ей имя удаляемого параметра. В случае успеха возвращает True, иначе False.
Дает сведенья о размере значения и типе параметра по его имени для текущего ключа.
end;
Данный тип служит для получения сведений о размере значения и типе параметра.
end;
Заполняет переменную Value нулями и вызывает функцию RegQueryValueEx для текущего ключа, передавая имя параметра. При этом по возвращению из функции переменная Value в поле DataSize содержит размер значения параметра в байтах, а поле RegData заполняется с помощью функции преобразования DataTypeToRegData потому, что значения типов для Windows и Delphi не полностью совпадают (например, REG_BINARY = 3, а rdBinary = 4). Возвращает True в случае успеха и False иначе.
Дает размер (в байтах) значения параметра с указанным именем для текущего ключа.
end;
Вызывается метод GetDataInfo, если удачно, то возвращается значение поля DataSize (размер значения в байтах), в если нет, то -1.
Дает тип значения параметра с указанным именем для текущего ключа.
end;
Вызывается метод GetDataInfo , если удачно, то возвращается поле RegData (тип значения), а если нет, то устанавливается rdUnknown.
Дает информацию о текущем ключе.
end;
Данный тип необходим для получения информации о ключе. Поля предназначены для возврата в них следующих значений:
end;
end;
Заполняет переменную Value нулями и вызывает функцию RegQueryInfoKey для текущего ключа, подставляя адреса соответствующих полей. Если поддерживаются DBCS (double-byte character set) символы (SysLocale.FarEast := True) и операционная среда WindowsNT, удвоить значение полей длин, потому что два байта на символ. Возвращает True в случае успеха и False иначе.
Возвращает список всех дочерних ключей принадлежащих текущему ключу.
end;
end;
end;
Очищает список и вызывает метод GetKeyInfo, дающий информацию о текущем ключе, с целью выяснить максимальную длину имени дочернего ключа и количество этих ключей. Если вызов прошел успешно, то создает вспомогательную переменную S размером как самое длинное имя дочернего ключа плюс терминальный ноль. И в цикле с помощью функции RegEnumKeyEx получает имя за именем, добавляя их в список.
Возвращает список всех имен параметров принадлежащих текущему ключу.
end;
end;
end;
Очищает список и вызывает метод GetKeyInfo, дающий информацию о текущем ключе, с целью выяснить максимальную длину имен параметров и их количество. Если вызов прошел успешно, то создает вспомогательную переменную S размером как самое длинное имя параметра плюс терминальный ноль. И в цикле с помощью функции RegEnumValue получает имя за именем, добавляя их в список.
Возвращает True, если текущий ключ имеет хотя бы один дочерний ключ.
end;
Данный тип необходим для получения информации о ключе. Поля предназначены для возврата в них следующих значений:
end;
Вызывает метод GetKeyInfo и в случае удачи проверяет поле NumSubKeys временной переменной Info. Если принять на вооружение описанный прием, то самим методом можно и не пользоваться. Это будет более рационально, так как вы заодно получите в свое распоряжение переменную, которая просто напичкана полезными сведеньями.
Проверка наличия ключа по указанному пути.
end;
Вызывает метод GetKey, который пытается открыть указанный ключ и если ему это удается, т.е. ключ существует, возвращает дескриптор отличный от нуля. Это обстоятельство служит основанием для немедленного закрытия ключа (функция RegCloseKey).
Создает указанный ключ как дочерний корневого ключа и сохраняет в нем улей (часть реестра), находящийся в отдельном файле, который предварительно должен быть создан с помощью метода SaveKey.
end;
Если путь абсолютный, удаляется лидирующий слеш, потому что Windows оперирует относительными путями. Вызывается функция RegLoadKey для корневого ключа. Возвращает True в случае удачи и False иначе.
Переносит ключ, его дочерние ключи и параметры в новое место и с новым именем.
Метод MoveKey содержит три вспомогательные процедуры. Первая, по порядку описания, MoveVlue осуществляет копирование имени и значения для одного параметра.
Во временной переменной запоминается текущий ключ, а ключ источника копирования назначается текущим. Так приходится поступать, потому что далее вызываемые методы используют в качестве рабочего текущий ключ. Переходим в защищенный блок.
По имени параметра, с помощью метода GetDataSize, получает длину данных (длину значения параметра). Если эта длина больше 0 (данные для копирования существуют), заказывает память, необходимого размера, под буфер, через который будет осуществлять копирование.
По имени параметра, с помощью метода GetData, получает значение параметра, длину данных этого значения и тип данных. Во временной переменой PrevKey сохраняет ключ источника и назначает ключ приемника в качестве текущего ключа. Вызывая метод PutData записывает данные из буфера в ключ приемника в качестве нового параметра. Тип данных передаваемых через буфер не важен (некоторая последовательность байт), а сам тип передается через переменную RegData.
end;
end;
end;
end;
end;
В завершающей части защищенных блоков восстанавливает ключ источника, освобождает память, запрошенную под буфер, и восстанавливает текущий ключ.
Вторая процедура CopyValues читает по очереди все параметры источника и с помощью процедуры MoveValue переносит их в ключ приемника.
Во временной переменной запоминается текущий ключ, а ключ источника копирования назначается текущим ключом потому, что далее вызываемые методы используют в качестве рабочего текущий ключ. Переходим в защищенный блок.
end;
end;
Вызывает метод GetKeyInfo, для того чтобы узнать количество параметров и размер самого длинного имени параметра. Копирует так называемый параметр по умолчанию (имя равно пустой строке) и для передачи имен параметров создает строку длинной на единицу больше чем размер самого длинного имени. Далее в цикле с помощью функции RegEnumValue получает имя за именем, копируя каждый из них в приемник.
end;
end;
В завершающей части защищенного блока восстанавливает текущий ключ.
Третья процедура CopyKeys рекурсивно копирует все дочерние ключи и принадлежащие им параметры.
Во временной переменной запоминается текущий ключ, а ключ источника копирования назначается текущим ключом потому, что далее вызываемые методы используют в качестве рабочего текущий ключ. Переходим в защищенный блок.
Вызывает метод GetKeyInfo, для того чтобы узнать количество дочерних ключей и размер самого длинного имени ключа. Для передачи имен ключей создает строку длинной на единицу больше чем размер самого длинного имени. Организует цикл, в котором с помощью функции RegEnumKeyEx получает имя очередного дочернего ключа.
end;
Для полученного имени открывается дескриптор, который будет служить новым источником копирования. Если открытие прошло успешно, то текущий ключ временно сохраняется и назначается на ключ приемника. Внутри приемника создается дочерний ключ с именем копируемого ключа. Он открывается для использования в качестве нового приемника. Производится копирование параметров для новых ключей и рекурсивно вызывается процедура CopyKeys для копирования дочерних ключей принадлежащих новым ключам. По возвращению из рекурсии новый ключ приемника закрывается.
end;
end;
end;
end;
end;
end;
end;
В завершающей части защищенных блоков восстанавливается ключ источника, закрывается ключ нового источника и восстанавливается текущий ключ.
Проверяет наличие ключа источника и отсутствие ключа приемника, иначе завершает работу ничего не сделав и не сообщив. Открывает ключ источника и в случае удачи создает и открывает ключ приемника.
end;
end;
end;
end;
Если открытие прошло удачно копирует параметры и дочерние ключи. Процедура CopyKeys рекурсивно обходит все дочерние ключи, копируя их параметры и их дочерние ключи, пока не будет скопировано все. Когда этот процесс закончится, проверит значение Delete и если она равна True, удалит ключ источника со всеми входящими в него ключами и параметрами. Закрывает ключи приемника и источника.
Обратите внимание, что при копировании внутрь себя произойдет зацикливание.
Открывает существующий или создает и открывает новый ключ.
Result := ErrorCode = ERROR_SUCCESS;
if Result then
end;
end;
Удаляется лидирующий слеш и в зависимости от значения CanCreate открывается или создается новый ключ. Если открытие закончилось успехом, то имеем два открытых дескриптора. Дескриптор текущего (теперь уже старого) ключа и новый переданный в переменной TempKey. Теперь с помощью процедуры ChangeKey освобождаем старый дескриптор и сохраняем новый.
Если параметры ключа не модифицировались, то закрывать его не обязательно. Однако не оставляйте на долго ключ открытым, все-таки реестр это база данных.
Для текущего ключа читает и помещает в буфер двоичное значение указанного параметра.
end else Result := 0;
end;
Запрашивает сведения о размере и типе значения указанного параметра. Если параметра с требуемым именем не существует, то выполнение прекращается и возвращается 0. Если тип значения не соответствует бинарному или размер буфера меньше размера значения параметра, то возбуждается исключение с указанием имени параметра виновного в этом. При успешной проверке вызывается метод GetData, который помещает в буфер данные и устанавливает возвращаемое значение в величину равную размеру этих данных.
Для текущего ключа возвращает логическое представление значения указанного параметра.
end;
Вызывается метод ReadInteger. Если полученное целое не равно нулю, то возвращается True, иначе False.
Для текущего ключа возвращает денежное представление значения указанного параметра.
end;
Вызывает метод GetData, который помещает в возвращаемое значение в величину равную значению параметра, устанавливает размер и тип этого значения. Если тип значения не соответствует бинарному или размер значения не равен размеру денежного типа (8 байт), то возбуждается исключение.
Для текущего ключа возвращает дата-время представление значения указанного параметра.
end;
Вызывает метод ReadDateTime, без каких либо преобразований.
Для текущего ключа возвращает дата-время представление значения указанного параметра.
end;
Вызывает метод GetData, который помещает в возвращаемое значение в величину равную значению параметра, устанавливает размер и тип этого значения. Если тип значения не соответствует бинарному или размер значения не равен размеру дата-время типа (8 байт), то возбуждается исключение.
Для текущего ключа возвращает вещественное представление значения указанного параметра.
end;
Вызывает метод GetData, который помещает в возвращаемое значение в величину равную значению параметра, устанавливает размер и тип этого значения. Если тип значения не соответствует бинарному или размер значения не равен размеру вещественного типа (8 байт), то возбуждается исключение.
Для текущего ключа возвращает целое значение указанного параметра.
end;
Вызывает метод GetData, который помещает в возвращаемое значение в величину равную значению параметра и устанавливает тип этого значения. Если тип значения не соответствует целому, то возбуждается исключение.
Для текущего ключа возвращает строковое значение указанного параметра.
end
else Result := '';
end;
С помощью метода GetDataSize определяет длину строки, включая терминальный нуль. Если длина больше нуля, то вызовом функции SetString создает строку и заполняет ее вызовом метода GetData. Если тип значения параметра строковый, то возвращенная строка типа PChar преобразуется в Delphi-подобную, путем установки длины строки SetLength. Иначе вызывается исключение.
Для текущего ключа возвращает дата-время представление значения указанного параметра.
end;
Вызывает метод ReadDateTime, без каких либо преобразований.
Меняет имя параметра для текущего ключа.
end;
end;
end;
end;
Проверяет наличие старого и отсутствие нового имени параметра и если это условие не выполняется, заканчивается без какого либо уведомления. В случае успешной проверки запрашивает размер значения параметра и если он отличается от нуля, создает промежуточный буфер полученного размера достаточного для передачи данных. С помощью метода GetData копируется значение параметра, вызовом метода DeleteValue удаляется старый параметр и обращением к методу PutData создает новый параметр. Освобождает промежуточный буфер.
Заменяет указанный ключ содержимым файла. Замена вступает в силу после перезагрузки системы.
end;
Если путь абсолютный, удаляется лидирующий слеш, потому что Windows оперирует относительными путями. Вызывается функция RegReplaceKey для указанного ключа. Возвращает True в случае удачи и False иначе.
В качестве ключа, участвующего в операции замены, можно использовать только ключи первого уровня вложенности от HKEY_LOCAL_MACHINE и HKEY_USER (т.е. являющиеся непосредственными потомками этих двух ключей). Следовательно, в качестве ключа можно использовать любой корневой ключ, при этом строка Key должна быть равна nil. Или имя любого ключа (но не путь), в том числе и вашего, для ключей HKEY_LOCAL_MACHINE и HKEY_USER.
Загружает в указанный ключ содержимое файла. Только WindowsNT.
end;
end;
Указанный ключ открывается путем вызова метода GetKey. Если открытие прошло успешно, вызывается функция RegRestoreKey и по ее окончанию ключ закрывается функцией RegCloseKey.
Сохраняет указанный ключ в файле в виде улья (часть реестра).
end;
end;
Открывает указанный ключ путем вызова метода GetKey. Если открытие прошло успешно, вызывается функция RegSaveKey. А когда она закончится, ключ закрывается вызовом функции RegCloseKey. Файл, в котором сохраняется ключ, не должен существовать. Ключ сохраняется со всеми параметрами и дочерними ключами (улей - часть реестра).
Удаляет ключ созданный с помощью метода LoadK