Как работать с реестром

Ответы на вопросы, чаще всего задаваемые в форумах VBStreets. Для тех, кому лень искать.
RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Как работать с реестром

Сообщение RayShade » 25.05.2004 (Вт) 10:55

Visual Basic имеет встроенные операторы и функции для работы с Системным Реестром (в дальнешем - реестр), он позволяет записывать, считывать и удалять данные только в разделе ключа HKEY_CURRENT_USER Software VB and VBA Program Setting.



Операторы:



Оператор SaveSetting – позволяет производить запись запись данных (автоматически создает подключи).



Синтаксис:





SaveSetting VBKeyName, Section, Key, Setting



Где:





SaveSetting имя самого оператора:





VBKeyName строковое значение, которое является именем внутреннего

подраздела VB and VBA Program Setting (иными словами,

создаваемая Вами главная папка);



Section строковое значение, которое является именем внутреннего

подраздела VBKeyName (иными словами, создаваемая Вами

папка находящаяся в Вашей главной папке. Таких Section -

папок у Вас может быть несколько.);



Key строковое значение, которое является именем параметра в

созданном, внутреннем подразделе Section (иными словами,

имя данных в созданной Вами Section - папке. Таких Key –



параметров у Вас может буть несколько.);



Setting строковое значение, которое Вы хотите присвоить созданному

Вами параметру;



Оператор DeleteSetting – позволяет удалять параметры и внутренние подразделы.



Синтаксис:



DeleteSetting VBKeyName, Section, Key



Где:



DeleteSetting имя самого оператора





VBKeyName строковое значение, которое является именем внутреннего

подраздела VB and VBA Program Setting (иными словами,

созданная Вами главная папка);



Section строковое значение, которое является именем внутреннего

подраздела VBKeyName (иными словами, одна из созданных

Вами папок находящихся в Вашей главной папке.);



Key строковое значение, которое является именем параметра в

удаляемом, внутреннем подразделе Section (иными словами,

имя удаляемых данных);



Если Вы захотите удалить сразу весь подраздел, а не некоторые параметры, то для этого используйте следующий синтаксис оператора DeleteSetting :



DeleteSetting VBKeyName, Section



Или, если Вы захотите удалить целиком созданный Вами внутренний подраздел VB and VBA Program Setting используйте следующий синтаксис оператора DeleteSetting :



DeleteSetting VBKeyName



Внимание!!! Пользуйтесь оператором DeleteSetting очень осторожно!



Функции



Функция GetSetting() – позволяет получить значения определенного параметра.



Синтаксис



MySet = GetSetting ( VBKeyName, Section, Key [, Default ] )



Где:



MySet строка для хранения возвращаемого функцией GetSetting значения;



GetSetting имя самой функции;





VBKeyName строковое значение, которое является именем внутреннего подраздела

VB and VBA Program Setting (иными словами, созданная Вами

главная папка);



Section строковое значение, которое является именем внутреннего подраздела

VBKeyName (иными словами, имя папки находящаяся в Вашей

главной папке.);



Key строковое значение, которое является именем параметра в созданном,

внутреннем подразделе Section (иными словами, имя данных

в Section - папке.);



Setting строковое значение, которое Вы хотите считать из данного параметра;



[ Default ] необязательный аргумент, представляющий строковое значение,

которое будет возвращено функцией в случае ошибки

(если такого параметра нет);



Функциа GetAllSettings() – позволяет получить массив значений из определенного подраздела.



Синтаксис:



MySet = GetAllSettings ( VBKeyName, Section)



Где:



MySet строка для хранения возвращаемого функцией GetAllSettings

значения;



GetAllSettings имя самой функции;





VBKeyName строковое значение, которое является именем внутреннего

подраздела VB and VBA Program Setting (иными словами,

созданная Вами главная папка);



Section строковое значение, которое является именем внутреннего

подраздела VBKeyName (иными словами, имя папки

находящаяся в Вашей главной папке.);



Обработать массив значений и получить информацию в удобном виде можно следующим образом:



Dim intSettings As Integer



MySet = GetAllSettings(App.Title, "PortSettings")



For intSettings = LBound(MySet, 1) To UBound(MySet, 1)



Debug.Print MySet(intSettings, 0), MySet(intSettings, 1)



Next intSettings



End Sub





Чтение/Запись данных в системный реестр (API):



Объявите все константы и API-функции в отдельном модуле. Там же создайте функцию по созданию ключа, функцию записи в него данных, функцию считывания данных , функцию удаления данных из ключа и функцию удаления самого ключа.



Option Explicit



Public Const REG_SZ As Long = 1

Public Const REG_DWORD As Long = 4





Public Const HKEY_LOCAL_MACHINE = &H80000002

Public Const HKEY_CLASSES_ROOT = &H80000000



Public Const HKEY_CURRENT_USER = &H80000001

Public Const HKEY_USERS = &H80000003





Public Const ERROR_NONE = 0

Public Const ERROR_BADDB = 1

Public Const ERROR_BADKEY = 2

Public Const ERROR_CANTOPEN = 3

Public Const ERROR_CANTREAD = 4

Public Const ERROR_CANTWRITE = 5

Public Const ERROR_OUTOFMEMORY = 6

Public Const ERROR_INVALID_PARAMETER = 7

Public Const ERROR_ACCESS_DENIED = 8



Public Const ERROR_INVALID_PARAMETERS = 87

Public Const ERROR_NO_MORE_ITEMS = 259



Public Const KEY_ALL_ACCESS = &H3F



Public Const REG_OPTION_NON_VOLATILE = 0



Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey 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, ByVal lpSecurityAttributes As Long, phkResult As Long, lpdwDisposition 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 RegQueryValueExString Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As String, lpcbData As Long) As Long



Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Long

, lpcbData As Long) As Long



Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As Long, lpcbData As Long) As Long



Declare Function RegSetValueExString Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As String, ByVal cbData As Long) As Long



Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, ByVal cbData As Long) As Long



Declare Function RegDeleteKey& Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String)



Declare Function RegDeleteValue& Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long

, ByVal lpValueName As String)





Создание нового ключа (подключа)



Public Function CreateNewKey(lPredefinedKey As Long, sNewKeyName As String)



Dim hNewKey As Long

Dim lRetVal As Long



lRetVal = RegCreateKeyEx(lPredefinedKey, sNewKeyName, 0&, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0&, hNewKey, lRetVal)



RegCloseKey (hNewKey)



End Function





Запись данных в ключ





Public Function SetKeyValue(lPredefinedKey As Long, sKeyName As String, sValueName As String, vValueSetting As Variant, lValueType As Long)



Dim lRetVal As Long



Dim hKey As Long



lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey)

lRetVal = SetValueEx(hKey, sValueName, lValueType, vValueSetting)



RegCloseKey (hKey)



End Function



Public Function SetValueEx(ByVal hKey As Long, sValueName As String, lType As Long, vValue As Variant) As Long



Dim lValue As Long

Dim sValue As String



Select Case lType





Case REG_SZ

sValue = vValue

SetValueEx = RegSetValueExString(hKey, sValueName, 0&, lType, sValue, Len(sValue))



Case REG_DWORD

lValue = vValue

SetValueEx = RegSetValueExLong(hKey, sValueName, 0&, lType, lValue, 4)



End Select



End Function





Возвращает значения записанные в ключе



Public Function QueryValue(lPredefinedKey As Long, sKeyName As String, sValueName As String)



Dim lRetVal As Long

Dim hKey As Long

Dim vValue As Variant



lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey)

lRetVal = QueryValueEx(hKey, sValueName, vValue)



QueryValue = vValue

RegCloseKey (hKey)



End Function



Function QueryValueEx(ByVal lhKey As Long, ByVal szValueName As String, vValue As Variant) As Long



Dim cch As Long

Dim lrc As Long

Dim lType As Long

Dim lValue As Long

Dim sValue As String



On Error GoTo QueryValueExError



'Определение размера и типа считываемых данных



lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch)



If lrc <> ERROR_NONE Then MsgBox "Данных (ключа) не существует!", vbExclamation, Form1.Caption



Select Case lType



'Для символьных

Case REG_SZ:

sValue = String(cch, 0)

lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, sValue, cch)

If lrc = ERROR_NONE Then



vValue = Left$(sValue, cch)



Else

vValue = Empty



End If



'Для числовых

Case REG_DWORD:



lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, lValue, cch)



If lrc = ERROR_NONE Then vValue = lValue



'Для остальных не поддержанных типов данных

Case Else

lrc = -1



End Select



QueryValueExExit:

QueryValueEx = lrc

Exit Function



QueryValueExError:



Resume QueryValueExExit



End Function





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



Public Function DeleteValue(lPredefinedKey As Long, sKeyName As String, sValueName As String)



Dim lRetVal As Long

Dim hKey As Long



lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey)

lRetVal = RegDeleteValue(hKey, sValueName)



RegCloseKey (hKey)



End Function





Удаление ключа



Public Function DeleteKey(lPredefinedKey As Long, sKeyName As String)



Dim lRetVal As Long



lRetVal = RegDeleteKey(lPredefinedKey, sKeyName)



End Function



Вызов функций из модуля осуществляется следующим образом:



Создание ключа



CreateNewKey HKEY_LOCAL_MACHINE, "VB6"



'Можно создать и подключи

'CreateNewKey HKEY_LOCAL_MACHINE, "VB6RegistryKey"



Запись данных в ключ



SetKeyValue HKEY_LOCAL_MACHINE, "VB6", "Program", "Ваши данные", REG_SZ



Считывание данных



Dim Variable As Variant



Variable = QueryValue(HKEY_LOCAL_MACHINE, "VB6", "Program")



Удаление данных из ключа



DeleteValue HKEY_LOCAL_MACHINE, "VB6", "Program"



Удаление ключа



DeleteKey HKEY_LOCAL_MACHINE, "VB6"



Внимание! Соблюдайте осторожность, что бы не удалить главный ключ реестра Windows.

Вернуться в Популярные вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList