Visual Basic 6. Руководство разработчика

       

Функции доступа к системной базе данных


Registry

Registry Windows 95/98 - это иерархическая база данных (часто называемая реестром),

содержащая информацию об установках Windows. В нее входит инфор­мация о пользователях, о конфигурации аппаратных средств системы и прикладных программах. Registry заменила INI-файлы (использовавшиеся в предыдущих версиях Windows), которые предназначались для хранения информации в перерывах между сеансами работы.

Для доступа к Registry воспользуйтесь программой Regedit. Для ее запуска выполните следующие действия.

1. Выберите команду Run в меню Start (команда Выполнить в меню Пуск).

2. В окне Run (Пуск) наберите regedit и нажмите клавишу Enter, чтобы открыть окно Registry Editor, показанное на рис. 13.9.

Если выполнить двойной щелчок на одном из объектов в главном окне Regedit, то данные, записанные в Registry, появятся на экране в виде древовидной структуры. Объект самого верхнего уровня обычно называют Registry key

(раздел базы данных), а находящиеся в нем объекты нижнего уровня - подразделами Registry включает следующие разделы.

• HKEY_CLASSES_ROOT хранит информацию о зарегистрированных расшире­ниях и файловых ассоциациях, данные OLE.

• HKEY_CURRENT_USER относится к текущему пользователю Если он един­ственный, то содержание этого раздела полностью совпадает с подразделом HKEY_USERS.

• HKEY_LOCAL_MACHINE хранит информацию о конфигурации аппаратных средств, установленных на компьютере Подразделы HKEY_LOCAL_MACHINE.

• HKEY_USERS содержит информацию о конфигурации рабочего стола, параметры сети и другие сведения об отдельных пользователях, которые могут регистрироваться на данном компьютере

• HKEY_CURRENT_CONFIG содержит информацию об установленных шрифтах и принтерах.



• HKEY_DYN_DATA хранит сведения о производительности компьютера. После старта системы они загружаются в оперативную память и могут там динамически изменяться.

Рис. 13.9. Главное окно Registry Editor

Предупреждение

Следует предельно аккуратно обращаться с информацией, расположенной в реестре. Повреждение нескольких объектов, находящихся в нем, может привести к прекращению работы системы вплоть до невозможности загрузки. Прежде чем выполнять какие-либо действия с содержимым реестра, пользуясь средствами Visual Basic, убедитесь, что сделаны резервные копии файлов SYSTEM.DAT и USER.DAT. С их помощью всегда можно восстановить исходное состояние базы данных Registry. Прежде чем выполнять с ним какие-либо действия, следует обратиться к Windows по вопросам процедур резервного копирования и восстановления. Лучше всего начинать с использования функций, встроенных в Visual Basic, которые являются вполне "безопасными" (они описаны в Приложении А на компакт-диске), а затем переходить к использованию API-функции.


Можно воспользоваться Regedit, чтобы выяснить, какого типа информация требуется определенным приложениям. Относительно безопасно использовать Registry для хранения информации о приложении. Например, можно сохранить информацию об инициализации приложения, чтобы при следующем запуске можно было просмотреть информацию об установках предыдущего сеанса работы. Список недавно открывавшихся файлов, которые можно найти почти в каждом приложении Windows, хранится в Registry. Манипулируя содержимым реестра, следует внимательно следить за тем, чтобы не изменить информацию о других приложениях. Изменяйте информацию, имеющую отношение только к вашим собственным приложениям.

Работа с реестром заслуживает того, чтобы надолго на ней остановиться. В этом параграфе будет рассмотрена процедура создания новой ветви в базе данных Registry для сохранения информации, которую приложение считывает. Это несложная процедура, полезная для всех, кто работает с Registry.

VB6 в действии: проект Registry

Приложение Registry позволяет продемонстрировать процесс создания разделов в реестре Windows (Registry), записи соответствующих значений и получения данных из него. В приложении создаются три подраздела HKEY_LOCAL_ MACHINE, в которых хранятся размеры формы, запущенной при предыдущем сеансе работы:

•  \Sybex\Mastering VB 6.0

• Window Width (Ширина Окна)

• Window Height (Высота Окна)

В программе (рис. 13.10) используются подразделы

Window Width (Ширина Окна) и Window Height (Высота Окна) для хранения ширины и высоты окна (данные записываются приложением Registry).



Рис. 13.10. Программа Registry запоминает размеры формы, установленные во время предыдущего сеанса работы

Когда программа запускается, она пытается получить значения, хранящиеся в подразделах Window Width и Window Height с помощью функции RegQueryValue Ex(). Если эти подразделы содержат значения, то программа просто получает их и устанавливает, соответственно, ширину и высоту окна. Если эти подразделы не содержат значений, значит, в Registry нет соответствующих элементов. Затем программа устанавливает высоту и ширину текущего окна и сохраняет эту инфор­мацию в реестре с помощью функции RegSet Value Ех(). Функция RegCreateKeyO позволяет создать определенный элемент реестра. Если такой элемент существует, то функция открывает к нему доступ.



Если размеры окна изменяются пользователем, программа сохраняет новые значения высоты и ширины окна в реестре с помощью метода

QueryUnload. При последующем запуске программы окно будет иметь именно эти размеры. Таким образом, можно организовать сохранение установок инициализации программы в реестре, а затем получать их при запуске приложения. Чтобы проверить проект Registry, закройте форму щелчком на кнопке Close. Если работа приложения завершена с помощью команды End меню Run (команда Закончить в меню Выполнить) в IDE-среде Visual Basic, то событие QueryUnload не вызывается.

Ниже приводится текст программы Registry.

Программа 13.11. Программа Registry

Option Explicit

Private Declare Function RegCreateKey Lib "advapi32.dll" _

Alias "RegCreateKeyA" (ByVal hKey As Long, _

ByVal IpSubKey As String, phkResult As Long) As Long

Private Declare Function RegDeleteKey Lib "advapi32.dll"

Alias "RegDeleteKeyA" (ByVal hKey As Long,

ByVal IpSubKey As String) As Long

Private Declare Function RegDeleteValue Lib "advapi32.dll" _

Alias "RegDeleteValueA" (ByVal hKey As Long, _

ByVal IpValueName As String) As Long

Private Declare Function RegQueryValueEx Lib "advapi32.dll" _

Alias "RegQueryValueExA" (ByVal hKey As Long,

ByVal IpValueName As String, ByVal IpReserved As Long, _

IpType As Long, IpData As Any, IpcbData As Long) As Long

Private Declare Function RegSetValueEx Lib "advapi32.dll" _

Alias "RegSetValueExA" (ByVal hKey As Long, _

ByVal IpValueName As String, ByVal Reserved As Long,

_

ByVal dwType As Long, IpData As Any, _

ByVal cbData As Long) As Long

Const ERROR_SUCCESS = 0&

Const ERROR_BADDB = 1009&

Const ERROR_BADKEY = 1010&

Const ERROR_CANTOPEN = 1011&

Const ERROR_CANTREAD = 1012&

Const ERROR_CANTWRITE = 1013&

Const ERROR_REGISTRY_RECOVERED = 1014 &

Const ERROR_REGISTRY_CORRUPT = 1015&

Const ERROR_REGISTRY_IO_FAILED = 1016&



Const HKEY CLASSES ROOT = &H80000000

Const HKEY_CURRENT_USER = &H80000001

Const HKEY_LOCAL_MACHINE = &H80000002

Const REG_SZ = 1

‘ Dim regKey As String

Const regKey = "\Sybex\Mastering VB 6.0"

Private Sub ForraLoad()

Dim retValue As Long, result As Long

Dim keyID As Long, keyValue As String

Dim subKey As String

Dim bufSize As Long

Label 6.Caption = regKey

‘ Создание раздела

retValue = RegCreateKey(HKEY_LOCAL_MACHINE, regKey, keyID)

If retValue = 0 Then

‘ Сохранение значения ширины

subKey = "Window Width"

retValue = RegQueryValueEx(keyID, subKey, 0&, _

REG_SZ, OS, bufSize)

‘ Если значение не задано, установить его

If bufSize < 2 Then

   keyValue = Me.Width

   retValue = RegSetValueEx(keyID, subKey, 0&, _

REG_SZ, ByVal keyValue, Len(keyValue) + 1)

Else

   keyValue = String(bufSize + 1, " ")

   retValue = RegQueryValueEx(keyID, subKey, _

           0&, REG_SZ, ByVal keyValue, bufSize)

   keyValue = Left$(keyValue, bufSize - 1)

   Me.Width = keyValue

End If

‘ Установка значений для формы

Label4.Caption = subKey

Label5.Caption = Me.Width

‘ Запись значения высоты

subKey = "Window Height"

retValue = RegQueryValueEx(keyID, subKey, 0&,

_

REG_SZ, 0&, bufSize)

If bufSize < 2 Then

   keyValue = Me.Height

   retValue = RegSetValueEx(keyID, subKey, 0&, _

REG_SZ, ByVal keyValue, Len(keyValue) + 1)

Else

   keyValue = String(bufSize + 1, " ")

   retValue = RegQueryValueEx(keyID, subKey, 0&, REG_SZ, _

ByVal keyValue, bufSize)

   keyValue = Left$(keyValue, bufSize - 1)

   Me.Height = keyValue

End If

‘ Установка значений для формы

Label8.Caption = subKey

Label7.Caption = Me.Height

   End If

End Sub

Private Sub Form_QueryUnload(Cancel As Integer, _

UnloadMode As Integer)

Dim keyValue As String

Dim retValue As Long, keyID As Long

   retValue = RegCreateKey(HKEY_LOCAL_MACHINE, regKey,     keyID)

   keyValue = Me.Width

   retValue = RegSetValueEx(keyID, "Window Width", 0&,

   REG_SZ, ByVal keyValue, Len(keyValue) + 1)

   keyValue = Me.Height

   retValue = RegSetValueEx(keyID, "Window Height", 0&, _

   REG_SZ, ByVal keyValue, Len(keyValue) + 1)

End Sub

Приложение Registry успешно работает в Windows 95/98 (но не в Windows NT 4).


Содержание раздела