Статьи

Грамотно работаем с реестром

Часть 4. Работа с реестром через подключаемые библиотеки.

Изначально эта часть не была запланирована для данной статьи. Подтолкнул меня к написанию один из "Советов…" Андрея Колесова и Ольги Павловой, которые вот уже на протяжении ряда лет публикующих в "Компьютер-Пресс" свои интересные находки по VB и VBA.

Так вот, оказывается, что при инсталляции VB происходит установка на Ваш компьютер одной маленькой библиотеки (всего 32 Кб) - REGTOOL5.DLL. Для любознательных указываю полный путь: …\Program Files\Microsoft Visual Studio\Common\Tools\APE\REGTOOL5.DLL. Она содержит всего 4 функции для работы с реестром, однако использование этих функций значительно упрощает доступ к реестру.

Итак, для начала работы подключим данную библиотеку к нашему проекту (Проект Standard EXE; форма + 5 кнопок на ней). Для подключения выберем меню: Project/References и в открывшемся диалоговом окне отметим опцию Registry Access Functions. Не забудем нажать ОК :-)

Теперь, когда библиотека подключена к проекту, небходимо объявить переменную. Делаем это в разделе деклараций

Option Explicit

Dim Reg As Registry

При загрузке формы – инициализируем ее

Private Sub Form_Load()

  Set Reg = New Registry

End Sub

А при выгрузке – не забудем ее уничтожить.

Private Sub Form_Unload(Cancel As Integer)

  Set Reg = Nothing

End Sub

Теперь займемся функциями. Как я говорил выше их всего 4: UpdateKey, DeleteKey, GetKeyValue, GetNextValue. А так же имеется 5 констант:

Const HKEY_CLASSES_ROOT = -2147483648 (&H80000000)

Const HKEY_CURRENT_USER = -2147483647 (&H80000001)

Const HKEY_LOCAL_MACHINE = -2147483646 (&H80000002)

Const HKEY_PERFORMANCE_DATA = -2147483644 (&H80000004)

Const HKEY_USERS = -2147483645 (&H80000003)

Результаты работы наших функций можно проверять через Редактор Реестра. Только не забудьте обновлять содержимое его окна после выполненных манипуляций (клавиша F5).

Для нашего примера выберем все ту же (самую безопасную в смысле экспериментов) ветку реестра: HKEY_CURRENT_USER\SOFTWARE\VB and VBA Program Settings.

NB! Данная библиотека может работать с любой веткой реестра.

Присвоим нашей ПЕРВОЙ кнопке возможность создания нового параметра и значения для него.

Private Sub Command1_Click()

  Reg.UpdateKey HKEY_CURRENT_USER, _
    "SOFTWARE\VB and VBA Program Settings\TestRegistryDLL", _
    "FirstValue", "Test"

  Reg.UpdateKey HKEY_CURRENT_USER, _
    "SOFTWARE\VB and VBA Program Settings\TestRegistryDLL", _
    "SecondValue", "Test2"

  MsgBox "Создана папка TestRegistryDLL и 2 параметра в ней"

End Sub

Заметили интересную особенность? При отсутствии необходимой папки, она автоматически создается этой функцией. Кроме того, данная функция позволяет изменять значение уже существующего параметра. Что мы и покажем на примере ВТОРОЙ кнопки.

Private Sub Command2_Click()

  Reg.UpdateKey HKEY_CURRENT_USER, _
    "SOFTWARE\VB and VBA Program Settings\TestRegistryDLL", _
    "SecondValue", "New Test"

  MsgBox "Изменено значение 2-го параметра в папке TestRegistryDLL"

End Sub

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

Ну что ж, двинулись дальше. Создавать и изменять параметры мы научились – теперь самое время научиться их удалять. К ТРЕТЬЕЙ кнопке привяжем функцию удаления. Если Вы внимательно изучали данные функции (например через Object Browser), то, наверное, заметили, что все функции возвращают тип Boolean. Воспользуемся этой замечательной возможностью для проверки эффективности работы нашей функции.

Private Sub Command3_Click()

  If Reg.DeleteKey(HKEY_CURRENT_USER, _
    "SOFTWARE\VB and VBA Program Settings\TestRegistryDLL") Then

    MsgBox "Удалена папка TestRegistryDLL"

  Else

    MsgBox "Ничего не получилось :("

  End If

End Sub

NB! Данная функция удаляет целиком папку и в ней не предусмотрено удаление отдельно взятого параметра. Как мне кажется, это самый главный недостаток данной библиотеки, при всех остальных громадных плюсах.

Ну и, наконец, оставшиеся две функции служат для поиска (получения) значений указанных параметров. Запишем код для ЧЕТВЕРТОЙ кнопки. Основа кода взята из "Советов …" Андрея Колесова

Private Sub Command4_Click()

Dim KeyFound As Boolean, strValue As String

strValue = ""

KeyFound = Reg.GetKeyValue(HKEY_CURRENT_USER, _
    "SOFTWARE\VB and VBA Program Settings\TestRegistryDLL", _
    "SecondValue", strValue)

  If KeyFound Then

    MsgBox strValue

  Else

    MsgBox "Такого параметра нет"

  End If

End Sub

Другая функция чуть-чуть посложнее (хотя принцип тот же, что и у предыдущей), она считывает последовательно все параметры и их значения.

Private Sub Command5_Click()

Dim KeyFound As Boolean, strName As String, strValue As String

strValue = ""

Do

  KeyFound = Reg.GetNextValue(HKEY_CURRENT_USER, _
    "SOFTWARE\VB and VBA Program Settings\TestRegistryDLL", _
    strName, strValue)

    If KeyFound = False Then Exit Do

    MsgBox strName & " = " & strValue

Loop While KeyFound

MsgBox "Больше параметров нет!"

End Sub

На этом примере можно закончить работу с подключаемой библиотекой Registry Access Functions. В заключение хочется отметить необчно маленький для Microsoft размер и простоту в работе.

В заключение: Не только эта библиотека имеет доступ к реестру. Если Вы подключили к своему проекту библиотеку Word'а (начиная с версии 8) например для проверки орфографии, то параллельно, для получения значений реестра можно воспользоваться ее объектом System, а конкретнее свойствами PrivateProfileString и ProfileString. Что самое смешное, таких возможностей не имеет ни Excel, ни Access, ни PowerPoint, ни FrontPage. Ох уж этот Microsoft :).

2001 г.

К статьям
Hosted by uCoz