Реестр - это иерархическая база данных, котороя используется Windows приложениями, чтобы сохранять и возвращать конфигурационные данные. О устройстве реестра и какие API функции надо применять при работе с ним - пойдёт речь в этой статье.
» Введение
Реестр - это иерархическая база данных, котороя используется Windows приложениями, чтобы сохранять и возвращать конфигурационные данные. Данные реестра хранятся в двоичном виде. Чтобы управлять данными реестра, приложение должно использовать специальные Win32 API функции. В этой статье описывается сам реестр и функции для его доступа.
» Структура реестра
Реестр сохраняет данные в иерархичном стурктурированном дереве. Каждый узел дерева называется ключём. Каждый ключ может содержать в себе подключи и записи, у которых есть значения (каждый ключ может содержать сколько угодно записей).
Имя ключа может быть от одного до нескольких ASCII символов, начиная с номера 32 и заканчивая номером 127. Имя ключа не должно содержать: символы пробела, обратный слэш, знак умножения и вопросительный знак, - и также имя ключа не должно быть локализовано под местный язык, хотя значения записей могут быть локализованы.
Существует технические ограничения для размера и типа данных, сохраняемых в реестре. Программа может сохранять данные о инициализаци и настройке в реестре, но другие данные она должна хранить в каком - нибудь другом месте. В общем, данные, превышающие 1 Кб должны быть сохранены в двоичном файле, а в реестре должен быть ключ с сылкой на этот файл.
» Родительские ключи
Пред тем как работать с данными реестра приложение должно открыть какой - нибудь ключ. Чтобы открыть конкретный ключ надо указать родительский уже открытый системой ключ:
HKEY_CLASSES_ROOT - Ключ реестра опеределяет типы (классы) файлов и свойства, связанные с ними. HKEY_CURRENT_USER - Ключ реестра, определяющий свойства текущего пользователя. Свойства включают в себя настройки цветов, принтеров сети и др. HKEY_LOCAL_MACHINE - Информация об аппаратной и программной конфигурации системы. HKEY_USERS - Часть реестра управляет настройками для текущего и новых пользователей. HKEY_CURRENT_CONFIG - Здесь хранятся данные конфигурации системы (также находится в виде подключа HKEY_LOCAL_MACHINE). HKEY_DYN_DATA - Ключ используется для хранения данных, используемых в текущем сеансе.
» Доступ к ключам
Как уже говорилось, чтобы работать с данными реестра надо открыть или создать новый ключ. Приложение должно использовать API функции RegOpenKey или RegOpenKeyEx чтобы открыть ключ, и API функции RegCreateKey или RegCreateKeyEx чтобы создать новый
Приложение должно использовать API функцию RegCloseKey чтобы закрыть ключ и сохранить его данные в реестре. Сама API функция не записывает данные в реестре, просто все изменяемые данные реестра записываются в кэш на жёсткий диск. Чтобы данные сразу сохранялись в реестре можно воспользоваться функцией RegFlushKey. Но так как эта функция занимает много системных ресурсов, она должна быть использована в редких случаях, лишь когда это необходимо.
Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, phkResult As Long, lpdwDisposition As Long) As Long
Declare Function RegCloseKey Lib "advapi32.dll" Alias "RegCloseKey" (ByVal hKey As Long) As Long
Declare Function RegFlushKey Lib "advapi32.dll" Alias "RegFlushKey" (ByVal hKey As Long) As Long
» Доступ к данным
Чтобы установить значение какой - либо записи воспользуйтесь API функциями RegSetValue и RegSetValueEx. Первая функция работает только со строками, а вторая с любыми типами данных. Для удаления значения или ключа используйте фукции RegDeleteValue и RegDeleteKey соответственно. Чтобы изменить защитную информацию ключа используйте функцию RegSetKeySecurity.
Declare Function RegSetKeySecurity Lib "advapi32.dll" Alias "RegSetKeySecurity" (ByVal hKey As Long, ByVal SecurityInformation As Long, pSecurityDescriptor As SECURITY_DESCRIPTOR) As Long
Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
» Перечисление данных
Для перечисление ключей какого - либо узла воспользуйтесь функциями RegEnumKey или RegEnumKeyEx. Функция RegEnumValue перечисляет все записи указанного ключа.
Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long
Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, ByVal lpReserved As Long, ByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As FILETIME) As Long
Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long
» Примеры
Открываем ключ:
Dim kWnd as Long 'указатель на открытый ключ RetVal = RegOpenKeyEx (HKEY_LOCAL_MACHINE, "SoftwareMicrosoftWindows", 0, KEY_ALL_ACCESS, kWnd) 'открываем ключ с полным доступом и передаём его указатель в переменную kWnd
Создаём ключ:
Dim kWnd as Long RetVal = RegCreateKey (HKEY_LOCAL_MACHINE, "SoftwareFaked", kWnd)
Закрываем ключ:
RetVal = RegCloseKey (kWnd) 'для закрытия ключа передаём указатель kWnd, полученный при открытии или создании ключа.
Думаю, что у вас не возникнут сложности с работой других API функций, т.к. они используются аналогично.