«VBA Использование Win32 API»
Win32 API (Application Program Interface) используется для расширения возможностей разрабатываемого приложения VBA. Средства Win32 API, применяемые как в приложениях Windows, так и в самом Windows 95/98 или Windows NT, можно использовать в разрабатываемой программе. Эти средства имеют большие различия друг от друга: одни задают поведение операционной системы, а другие просто подают звуковой сигнал. При использовании функций Win32 API требуется особая осторожность: при неправильном применении подпрограммы API. возникает сбой работы приложения VBA или даже Windows.
Далее описывается синтаксис процедур Win32 API и приводятся примеры их использования.
Основные вопросы:
Что такое Win32 API
Описание функций Win32 API
Программирование Win32 API с помощью VBA
Использование Win32 API
ЧТО ТАКОЕ WIN32 API?
API (Application Programming Interface) - интерфейс программирования приложений и всегда связан с другим приложением. Например, Microsoft Excel, Lotus Organizer и множество других приложений имеют API. Pазработчики программного обеспечения не покупают программный интерфейс, они строят его при создании приложений.
API позволяет внешним программам обращаться к программе, в которой имеется API. Таким образом, можно получить доступ из одной программы к средствам другой с помощью API основного приложения. Разрабатывая API, программист обеспечивает другим разработчикам возможность применения средств создаваемого приложения без использования его интерфейса.
Однако API используется не только внешними приложениями. Множество больших приложений используют API, чтобы обеспечить связь одной их части с другой. Создавая в таких приложениях вспомогательные функции и обращаясь к ним с помощью программного интерфейса, можно упростить разработку всего приложения.
Рассмотрев, как используется API, требуется описать, что такое API? API - это обычно не более чем просто набор функций, с помощью которых можно обратиться к средствам разрабатываемого приложения. Программа, реализующая API, часто занимает не больше 10 или 20 процентов всего приложения, однако, она должна обеспечивать доступ к 100 процентам функций этого приложения.
Win32 API идеально подходит под это описание: он обеспечивает доступ практически ко всем функциям Windows 95/98 и Windows NT. Win32 API помогает Windows 95/98 и Windows NT управлять памятью, различными устройствами, например принтером, обрабатывать события, рисовать на экране диалоговые окна и т. д.
Кроме того, Win32 API поддерживает связь одного приложения с другим. Например, большая часть Windows 9х является встроенной поддержкой сетей. Конечно, эта часть должна также выводить диалоговые окна, отображать сообщения и управлять памятью. В ней используются функции API, которые можно применять в разрабатываемом приложении VBA.
Во многих программах, например, Microsoft Excel и Lotus cc:Mail, также используется Win32 API. Если приложению или модулю Windows 9х или Wiindows NT требуется некоторое средство, то обычно вызывается функция Win32 API.
Использование библиотек динамической компоновки
Win32 API оформлен в виде библиотек динамической компоновки. В этих библиотеках хранятся все средства, к которым требуется обеспечить доступ в других приложениях. Библиотеки динамической компоновки получили такое имя благодаря тому, что приложения подключаются к ним во время выполнения и используют их функции.
Библиотеки динамической компоновки отличаются от библиотек статической компоновки, в которых программный интерфейс к внешним библиотекам встраивается в программное приложение на этапе компиляции. Кроме того, в разрабатываемом приложении можно задать вызов библиотеки динамической компоновки, даже если этой библиотеки вообще не существует. Поэтому если известно имя требуемой функции, библиотека, где она находится, а также нужные параметры, то можно создать программу, которая обращается к этой библиотеке динамической компоновки.
Одни файлы библиотек динамической компоновки имеют расширение DLL, другие - расширение ЕХЕ. Следующие файлы составляют большую часть Win32 API:
COMDLG32.DLL
DLLLZ32.DLL
GDI32.DLL
KERNEL32.DLL
USER32.DLL
VERSION.DLL
При программировании приложений VBA с использованием Win32 требуется работать с функциями, которые находятся в вышеприведенных файлах.
Когда нужно использовать Win32 API?
С помощью Win32 API можно использовать в разрабатываемом приложении не только средства VBA или основного приложения, но и те же фунции, что применяет Windows 9х или Windows NT. Эти средства позволяю пример, управлять памятью или создавать диалоговые окна для установки системного времени. Хотя в проекте VBA обычно используется только процент функций Win32 API, однако доступны практически все 100 процентов.
Win32 АPI включает более 1500 функций, поэтому здесь невозможно описать каждое средство. Вместо этого приводится классификация функцией API:
Управление Windows. Данная группа функций управляет рисованием окон на экране, а также обрабатывает нажатия клавиш и действия мышью при работе с окнами.
Элементы управления Windows. Данная группа функций управляет инструментами управления, используемыми в приложениях Windows, например, полями, кнопками и списками, а также стандартными диалоговыми окнами, такими как диалоговые окна "Открытие файла" и "Печать".
Настройка. Данная группа функций наиболее часто используется VBA. Эти функции позволяют воспользоваться средствами, которые содержатся на Панели управления. Например, можно использовать инструменты установки программ, а также работать с командной строкой и средством уплотнения файлов.
Графические средства. Win32 API включает большое количество функций, которые управляют графическими элементами окон приложений и самой операционной системой. Данная группа включает базисные функции, которые управляют рисованием точек на экране, а также цветом и печатью.
Системные средства. Данная группа функций управляет памятью, питанием компьютера, правами доступа к файлам, обменом данными между приложениями, системным временем и рядом других средств Windows.
Языковая поддержка. Данная группа обеспечивает языковую поддержку для Windows 9х, Windows NT и их приложений.
Сетевые средства. Данная группа функций обеспечивает сетевую поддержку, включая создание соединений, получение информации о пользователях и правах доступа, а также отсоединение от сервера.
Подробную информацию о группах и функциях Win32 API смотрите в руководстве по Win32 SDK, которое поставляется Microsoft.
ПРОГРАММИРОВАНИЕ WIN32 API В VBA
Описание подпрограммы
До использования функции или подпрограммы Win32 API, необходимо объявить ее в разделе описаний любого модуля. При этом можно создать отдельный модуль, в котором хранятся только описания. Если проект VBA держит ряд подпрограмм Win32 API, то полезно сгруппировать все описания, а также объявить используемые типы данных и константы в одном модуле.
При описании функций требуется задать:
Библиотеку динамической компоновки, в которой хранится требуемая функция
Передаваемые в функцию параметры и их тип
Тип возвращаемого значения
Предупреждение
Очень важно правильно описать подпрограмму API, т. к. при обращении к библиотеке динамической компоновки, которая не применяется в основном приложении. можно случайно занять память, используемую другим приложением или самой операционной системой. Далее возникают ошибки разного рода: от простого сообщения об ошибке до сбоя в работе операционной системы.
Приведем пример описания функций Win32 API:
Declare Function GetWindowsDirectory Lib "kernel32" Alias _ "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As _ Long) As Long - получает путь к каталогу Windows
Declare Function GetSystemDirectory Lib "kernel32" Alias _ "GetSystemDirectoryA" (ByVal IpBuffer As String, ByVal nSize As _ Long) As Long - получает путь к системному каталогу Windows
Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _ (ByVal nBufferLength As Long, ByVal IpBuffer As String) As Long - получает путь к каталогу, выделенному под временные файлы
Declare Function SetCurrentDirectory Lib "kernel32" Alias _ "SetCurrentDirectoryA"(ByVal lpPathName As String) As Long - задает текущий каталог
На первый взгляд приведенные примеры могут показаться очень сложным. Однако усвоив только несколько основных правил, можно безопасно и эффективно использовать Win32 API.
Использование WIN32API.TXT
Microsoft поставляет вместе со многими приложениями, включая Visual Basic, файл WIN32API.TXT, который содержит описание всех функций Win32 API. В данном файле находятся также описание структур данных" констант, используемых подпрограммами API. Длина файла слишком велика, чтобы включать его в каждый проект VBA, поэтому можно скопировать в модуль описание требуемых функций, а также типов данных или констант.
Синтаксис описания
Приведем синтаксис инструкции описания функции Win32 API:
Declare Function | Sub имя Lib "имя библиотеки" [Alias "псевдоним"] (аргументы) [As возвращаемый_тип]
Ниже приводится описание параметров функции.
Функции и процедуры
В Win32 API имеются функции и процедуры. В первом примере показано описание процедуры, а во втором - описание функции:
Declare Sub GetSystemTime Lib "kernel32" Alias "GetSystemTime" _ (lpSystemTime As SYSTEMTIME) - получает текущее системное время
Declare Function VerLanguageName Lib "kerne132" Alias _ "VerLanguageNameA" (ByVal wLang As Long, ByVal szLang As String, _ ByVal nSize As Long) As Long - получает текстовое название языка по идентификатору (&H4E3 - Windows (кириллица)
Обратите внимание на то, что в первом описании используется ключевое слово Sub.
Во втором описании используется ключевое слово Function. Обратите внимание на выражение As Long, которое указывает на тип возвращаемого функцией значения. Покажем фрагмент программы, при выполнении которой возникает ошибка несоответствия типов.
Declare Function SomeFunction Lib "SomeLib" (MyArgument) as Long
Dim MyReturn as String
MyReturn = SomeFunction(My Argument)
Задание имени библиотеки
При описании подпрограммы Win32 API необходимо задать библиотеку динамической компоновки, в которой находится эта подпрограмма.
Имя библиотеки указывается в кавычках после ключевого слова Lib. При этом обычно не требуется задавать расширение или путь к библиотеке.
Примечание
При обращении к функции Win32 API сначала производится поиск библиотеки в папке, из которой запущено приложение, а затем просматривается каталог SYSTEM папки Windows (SYSTEM32 для Windows NT). Если VBA не находит библиотеку в каталоге SYSTEM/SYSTEM32, то он пытается отыскать библиотеку в основном каталоге Windows. Таким образом, если не перемещать файлы из папки Windows, то разработчику совсем необязательно знать расположение библиотек на диске, т. к. они отыскиваются aавтоматически. Более того, перемещать файлы из папки SYSTEM/SYSTEM32 не рекомендуется при любых обстоятельствах.
Использование псевдонимов в описаниях
Псевдонимы позволяют вызвать функцию API в программе VBA под именем, которое отличается от заданного в библиотеке динамической компоновки названия. Псевдонимы появились в Win16 API, используемом в Windows 3.x и 16-битных приложениях Windows, из-за того, что имена функций API совпадали с некоторыми зарезервированными словами языка Visual Basic. По той же причине при описании функций Win32 API задаются псевдонимы, с помощью которых можно вызвать требуемые подпрограммы, т используя имен, эквивалентных ключевым словам VBA. Если имя функции совпадает с ключевым словом, требуется вызвать функцию, ссылаясь на нее c помощью псевдонима.
Передача аргументов по ссылке или по значению
Наиболее критической и потенциально ошибочной частью описания является список параметров. Поскольку Win32 API разработан прежде всего для использования в языке программирования С, а к подпрограммам обращаются из VBA, то необходимо знать, как передавать аргументы по ссылке и по значению.
В большинство используемых в VBA подпрограмм API требуется передать параметры. По умолчанию VBA передает параметры в подпрограмму по ссылке. Это означает, что вместо того, чтобы использовать в процедуре копию переменной, VBA передает ее 32-битный адрес в памяти. Располагая адресом переменной, т. е. ссылкой на нее, процедура может обращаться и изменять значение самой переменной, а не ее копии.
Кроме того, учитывая, что Win32 API предназначен для использования в языке С, в API используется соглашение этого языка о том, что по умолчанию параметры передаются в подпрограммы по значению, а не по ссылке. Это относится ко всем типам данным, исключая строки и массивы, которые всегда передаются по ссылке. Необходимо также отметить, что для некоторых функций API передача параметров по ссылке обязательна.
Приведем пример передачи параметров по ссылке и по значению в функцию чтения из файла:
Declare Function ReadFile Lib "kernel32" Alias "ReadFile" (ByVal _ hFile As Long, IpBuffer As Any, ByVal nNumberOfBytesToRead As Long, _ IpNumberOfBytesRead As Long, IpOverlapped As OVERLAPPED) As Long
При задании аргументов необходимо правильно указать способ передачи аргументов. При этом рекомендуется придерживаться следующих правил:
Тщательно изучите описание процедуры в файле WIN32API.TXT, чтобы узнать тип передаваемых параметров.
Тщательно изучите документацию по API и по требуемой процедуре. Документация по Win32 API поставляется вместе с Win32SDK, а также с Visual Basic.
Задание строк в качестве параметров описаний
Как уже отмечалось ранее, строки передаются в процедуры библиотеки динамической компоновки по ссылке, т. е. по адресу первого байта строки в оперативной памяти. Для этого в описании процедур используется ключевое слово ByVal. При передаче ссылки на строку она преобразуется в форму, которая применяется в языке С: в конце строки ставится символ Null, который указывает на ее окончание. Приведем пример использования функции Win32 API для запуска приложения со строками в качестве параметров:
Declare Function CreateProcess Lib "kerne132" Alias "CreateProcessA" (ByVal IpApplicationName As String, ByVal IpCommandLine As String, IpProcessAttributes As SECURITY_ATTRIBUTES, IpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal IpCurrentDriectory As String, IpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Проверка описания
По завершении задания описания необходимо проверить его. Для этого необходимо запустить любую подпрограмму, которая имеется в одном модуле с указанным описанием. При этом можно выявить ошибки в описании, а также неправильное использование констант. Необходимо отметить, что поскольку при запуске процедуры VBA автоматически компилируется модуль, в котором она находится, можно использовать любую подпрограмму она может быть не закончена или не использована в разрабатываемом приложении. Например, следующая подпрограмма устанавливает значение переменной. Конечно, вместо запуска проверочной процедуры можно просто скомпилировать проект.
Public Sub CheckDex ()
X=l
End Sub
Вызов подпрограммы Win32 API
После описания подпрограмм необходимо вызвать их. Обратиться к функции Win32 API настолько же просто, как и вызвать собственную функцию или подпрограмму. Необходимо только следовать следующим правилам:
Правильно описать используемые в подпрограмме переменные
Правильно обработать возвращаемые функцией значения
В программе показан вызов функции, которая определяет тип дисковода, заданного символом "F". Обратите внимание, как передается в функцию строка, как возвращаемое функцией значение записывается в переменную типа Long, и как используется блок Case... Select для обработки всех возвращаемых значений.
' Значения, возвращаемые функцией GetDriveType
Public Const DRIVE_REMOVABLE = 2'
Public Const DRIVE_FIXED = 3
Public Const DRIVE__REMOTE = 4
Public Const DRIVE_CDROM = 5.
Public Const DRIVE_RAMDISK = 6
Declare Function GetDriveType Lib "kerne132" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Public Sub DisplayDriveType ()
Dim sDriveLetter As String
Dim lDriveType As Long
sDriveLetter = "F:"
lDriveType = GetDriveType (sDriveLetter)
Select Case lDriveType
Case DRIVE_REMOVABLE
Debug.Print "Дисковод ", sDriveLetter, " используется для чтения дискет."
Case DRIVE_FIXED
Debug.Print "Диск ", sDriveLetter, " - жесткий диск."
Case DRIVE_REMOTE
Debug.Print "Диск ", sDriveLetter, " - сетевой диск."
Base DRIVE_CDROM
Debug.Print "Дисковод ", sDriveLetter, "используется для чтения компакт-дисков."
Case DRIVE__RAMDISK
Debug.Print "Диск ", sDriveLetter, " - виртуальньй диск."
Case Else
Debug.Print "Ошибка вызова функции."
End Select
End Sub
Использование строк в качестве возвращаемых значений
Ранее рассматривалось, как передать строки в качестве параметров функций Win32 API. Для использования строки в качестве возвращаемого подпро-граммой значения, необходимо передать в функцию строковую переменную, чтобы сама функция установила значение этой переменной.
Рассмотрим функцию GetTempPath (), используемую для определения папки, в которой Windows хранит промежуточные данные. Вызов функции. GetTempPath () является следующим:
return = GetTempPath (PathLength, Path)
Функция записывает в переменную Path путь к папке, в которой хранятся промежуточные данные. Например, в следующем фрагменте в окно отладки. выводится текущий путь к папке с временной информацией:
Return = GetTempPath (len (ThePath) , ThePath)
Debug.Print ThePath
Предупреждение
При вызове функции необходимо заранее указать размер возвращаемой строки, чтобы выделить память на ее хранение. В противном случае при записи строки в память можно испортить важную информацию, используемую основным приложением и даже операционной системой, что может привести к сбою в их работе. Если предварительно задать размер строки то функция вводит в строку только то количество данных, которое определено заданным размером строки.
Public Sub PrintTempPathO
Dim sThePath as String
Dim iPathLength as Long
Dim lResult as Long
iPathLength =256
sthePath = String$(iPathLength,0)
lResult = GetTempPath(iPathLength,sThePath)
End Sub
Значения, возвращаемые функциями Win32 API
Большинство подпрограмм Win32 API являются функциями. Возвращаемое значение - это либо данные, например, возвращаемое функцией GetDriveType () значение, либо просто результат выполнения функции: успешно или не успешно. Например, рассмотрим функцию SetCurrentDirectory (), которая устанавливает текущую папку:
Dim lReturn as long
lReturn = SetCurrentDirectory(С:\WORK")
Если функция установила папку "C:\WORK" текущей, то переменная lReturn имеет значение отличное от 0. В противном случае, например, если каталог не существует, переменной lReturn присваивается значение 0.
Примечание
Одни функции Win32 API возвращают значение 0 в случае успешного завершения, а другие - в случае ошибки. Подробную информацию о возвращаемых функциями Win32 API значениях смотрите в документации по Win32 SDK.
Кроме того, некоторые функции присваивают значение передаваемому в них параметру, а также имеют возвращаемое значение. Рассмотрим функцию GetPrivateProfile (), которая используется для чтения данных из файла INI, хранящего информацию о конфигурации 16-битных приложений Windows:
Dim lSize as long
Dim strSize as long
Dim strValue as string
strSize = 256
StrValue = String$ (strSize, 0)
lSize = GetPrivateProfileString ("CoolApplication", _ "ApplicationPath", "", strValue, strSize, "C:\MYINI.INI")
Функция GetPrivateProfile () извлекает значение параметра ApplicationPath раздела CoolApplication и присваивает его строковой переменной strValue, которая передается в функцию в качестве параметра. Кроме того, в переменную lSize записывается длина строки, присвоенной переменной strValue. Необходимо отметить, что если при выполнении функции GetPrivateProfile () возникает ошибка, то переменной lSize присваивается значение Null.
Работа с дескрипторами
Gри работе с Win32 API используются дескрипторы. Дескриптор - это 32-битное целое число, которое однозначно идентифицирует компоненты, используемые при программировании Win32 API, например, диалоговые окна, элементы управления в них, окна, битовые изображения, кисти, используемые для рисования картинок на экране, аппаратные средства. Необходимо отметить, что компоненту сначала назначается дескриптор, а затем этот дескриптор используется для работы с компонентом. Имена дескрипторов обычно задают имена, начинающиеся с префикса h.
В следующем описании параметр hWnd используется для задания дескриптора окна:
Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg_ As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin В As Long, ByVal _ wMsgFilterMax As Long) As Long
В следующем описании параметр hDevice является дескриптором конфигурации устройства:
Declare Function DeviceIoControl Lib "kerne132" Alias _ "DeviceIoControl" (ByVal hDevice As Long, ByVal dwIoControlCode As _ Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer _ As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, _ lpOverlapped As OVERLAPPED) As Long
При работе с дескриптором в VBA требуется только знать, где его указывать: обычно одна функция возвращает дескриптор компонента, а затем этот дескриптор используется для работы с элементом в других функциях.
Другие полезные примеры
Здесь приводятся несколько полезных примеров применения функций Win32 АРI.
Завершение работы Windows:
Модуль 1:
Declare Function ExitWindows Lib "user32" Alias "ExitWindowsEx" _ (ByVal dwReserved As Long, ByVal uReturnCode As Long) As Long
Const EWX_LOGOFF=0
Const EWX_SHUTDOWN=1
Const EWX_REBOOT=2
Const EWX_FORCE=4
Const EWX_POWEROFF=8
UserForm1:
Private Sub CommandButton1_Click()
Dim flag As Long
Dim Result As Long
If Me.OptionButton1.Value = True Then flag = 0
Else If Me.OptionButton2.Value = True Then flag = 8
Else If Me.OptionButton3.Value = True Then flag = 2
End If
Result = ExitWindows(flag, 0)
Unload Me
End Sub
Переключение на русскую кодировку:
Модуль 1:
Public Declare Function ActivateKeyboardLayout Lib "user32" (ByVal _ HKL As Long, ByVal flags As Long) As Long
Public Declare Function GetKeyboardLayout Lib "user32" (ByVal _ dwLayout As Long) As Long
UserForm1:
Private Sub UserForm_Initialize()
Dim lang As Long
lang = GetKeyboardLayout(0)
If lang <> 68748313 Then i = ActivateKeyboardLayout(68748313, 0)
End Sub
Закрытие окна:
Модуль 1:
Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
Declare Function DestroyWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
UserForm1:
Private Sub CommandButton3_Click()
Dim hwnd As Long, retval As Long
Dim temp As String
temp = "Games"
hwnd = FindWindow(CLng(0), temp) ' look for the window
retval = DestroyWindow(hwnd)
End Sub
Работа с реестром
В Windows 9х и Windows NT, a также приложениях, работающих под их управлением, используется специальная база данных, в которой хранится требуемая для выполнения программ информация: данные о компьютере, на котором инсталлировано программное обеспечение, о пользователях, об установленных аппаратных средствах и т. д. Эта база данных называется реестром. Для доступа к реестру из VBA используются функции Win32 АРI. Кроме того, чтобы просмотреть и отредактировать реестр вручную, можно запустить программу REGEDIT (REGEDT32 для Windows NT).
Перед рассмотрением функций, используемых для работы с реестром, опишем реестр и его структуру.
Структура реестра
Реестр имеет структуру дерева. В нем имеются шесть основных поддеревьев (пять в Windows NT). Элементы реестра называют ключами. Ключ может иметь подключи, а подключи - включать дополнительные ключи, например HKEY_CURRENT_USER\ControlPanel\ Accessibility.
Данные в реестре используются приложениями и операционной системой способами:
Иногда в приложении требуется просто проверить существование ключа. Например, приложение ищет ключ HKEY_CURRENT_CONFIG\Display\Settings и не проверяет наличие в нем подключей или параметров.
В других случаях требуется использовать данные, хранящиеся под ключом. Под ключами содержатся двоичные или строковые параметры и их значения. Каждый ключ имеет значение по умолчанию, а также любое число именованных значений.
Ключи реестра
В верхней части дерева реестра имеются шесть основных ключей. Рассмотрим каждый из них:
HKEY_LOCAL_MACHINE. Под данным ключом хранятся данные, описывающие установленные на компьютере аппаратные средства и программное обеспечение.
HKEY_CURRENT_CONFIG. Под данным ключом хранится информация о конфигурации установленных на компьютере аппаратных средств.
HKEY_DYN_DATA (только Windows 9х). Под данным ключом хранится информация об установленных на компьютере самонастраивающихся устройств Plug и Play.
HKEY_CLASSES_ROOT. Под данным ключом хранится информация установленном на компьютере программном обеспечении, включая данные, используемые операционной системой.
HKEY_USERS. Под данным ключом хранится информация о пользователях.
HKEY_CURRENT_USER. Под данным ключом хранится информация о текущем пользователе.
Использование VBA для доступа к реестру с помощью функций Win32 API
В VBA можно управлять реестром с помощью функций Win32 API, например:
Прочитать содержимое ключей реестра
Создать новые ключи в реестре
Прочитать и изменить значения под ключами
Экспортировать реестр в файл
Импортировать данные реестра из внешнего файла
Описания, константы и типы данных реестра
При рассмотрении нижеприведенных примеров предполагается, что описаны функции, константы и типы данных, используемые в подпрограммах Win32 API, которые работают с реестром.
Открытие ключа
Чтобы работать с ключами реестра, необходимо предварительно открыть их. При открытии ключа возвращается его дескриптор. Как уже отмечалось ранее, для ссылки на данные можно использовать их дескриптор, в данном случае для доступа к ключу используется дескриптор ключа. Для открытия ключа используется функция RegOpenKey (), которая возвращает значение, указывающее на то, было ли ее выполнение успешным или нет. Кроме того, данная функция присваивает своему аргументу дескриптор ключа. Покажем пример использования функции RegOpenKey (). В программе выводится число 0 в окне отладки, если при выполнении функции не возникло ошибок, а также отображается значение параметра hSubKeyHandle, который является дескриптором ключа
Программа открытия ключа:
Public Sub OpenRegistryKeyDemo()
Dim lReturn As Long
Dim sSubKey As String
Dim hSubKeyHandle As Long
lReturn = RegOpenKey&(HKEY_LOCAL_MACHINE, "Config", hSubKeyHandle)
Debug.Print lReturn
Debug.Print hSubKeyHandle
End Sub
Чтение значения параметра реестра
Получив дескриптор ключа, можно извлечь значение параметра реестра. При этом можно прочитать как значение параметра по умолчанию, так и величину любого именованного аргумента. Для чтения значения параметра реестра используется одна из двух функций:
Функция RegQueryValueO. Извлекает значение параметра по умолчанию
Функция RegQueryValueEx (). Извлекает значение именованного параметра.
Чтобы получить значение именованного параметра, используйте функцию RegQueryValueEx(). Например, под ключом HKEY_CURRENT_СОNFIG\Display\Settings имеется параметр Resolution, в котором хранится разрешение экрана. В программе показан пример чтения значения именованного параметра. Программа требует некоторых пояснений:
Функция RegOpenKey () используется для получения дескриптора требуемого ключа. Дескриптор передается в функцию RegQueryValueEx ().
Строковый параметр инициализируется до вызова функции, которая читает значение параметра реестра.
Третий аргумент функции RegQueryValueEx () зарезервирован для использования Windows, ему требуется присвоить значение 0.
Четвертый аргумент функции RegQueryValueEx () используется для задания типа возвращаемых данных. Возможные значения смотрите в списке констант реестра. Поскольку возвращаемая величина является строкой, необходимо указать константу REG_SZ, которая задает заканчивающуюся символом Null строку.
Public Sub GetRegistryNameValueDemo ()
Dim lReturn As Long
Dim sSubKey As String
Dim hSubKeyHandle As Long
Dim sValue As String
Dim lSize As Long
LSize=10
SValue=String$(lSize, 0)
lReturn = RegOpenKeyEx(HKEY_CURRENT__CONFIG, Display\Settings", 0, _ KEY_ALL_ACCESS, hSubKeyHandle)
If lReturn<> 0 Then Exit Sub
lReturn = RegQueryValueEx(hSubKeyHandle, "Resolution", 0, REG_SZ, _ sValue, lSize)
Debug.Print sValue
End Sub
Создание ключа
Реестр используется не только операционной системой и большими приложениями. Даже в маленькой программе VBA можно сохранить в реестре требуемые данные. При этом, наверное, понадобится создать ключ, выбрав и его хранения любой из основных ключей.
Функция RegCreateKey () используется для создания ключа реестра. Кроме того, для этого применяется функция CreateRegKeyEx (), которая имеет большее число аргументов, например, параметры, гадающие защиту.
С помощью функции RegCreateKey () можно создать как один, так и структуру из нескольких ключей, например, добавить ключ "NEWKEY" под ключ HKEY_CURRENT_USER, или создать структуру KEYONE\KEYTWO\KEYTHREE под ключом HKEY_CURRENT_USER. В программе показано создание структуры разделов под ключом HKEY_LOCAL_MACHINE.
Программа создания ключей реестра
Public Sub CreateRegistryKeyDemo ()
Dim lReturn As Long
Dim sSubKey As String
Dim hSubKeyHandle As Long
sSubKey = "SOFTWARE\Использование VBA\Win32 API\Обзор"
lReturn = RegCreateKey& (HKEY_LOCAL_MACHINE, sSubKey, _ hSubKeyHandle)
End Sub
Установка значения параметра
Для установки значений параметров реестра по умолчанию используется функция RegSetValue (), а для задания величин именованных параметров- функция RegSetValueEx(). Необходимо отметить, что функцию RegSetValueExО можно применять, например, для установки значений именованных параметров ключа, созданного предыдущей программой. В следующей программе показано использование функции RegSeiValue(). Перед установкой значений требуется открыть ключ, под которым находится требуемый параметр. Единственным исключением из этого правила являются параметры реестра, которые хранятся под одним из шести основных ключей (пяти в Windows NT). В этом случае следует задать имя ключа (например, HKEY_LOCAL_MACHINE), а не дескриптор ключа в качестве первого параметра функции RegSetValue ().
Программа требует некоторых пояснений:
Имя параметра и устанавливаемое значение непосредственно передаются в функцию RegSetValueEx ().
Переменная lValueSize задает длину присваиваемого параметру строкового значения.
В качестве четвертого аргумента функции RegSetValueEx () требуется задать тип устанавливаемого значения (REG_SZ). Список констант, соответствующих допустимым типам, приводится в разделе "Описания, константы и типы данных реестра".
Третий аргумент функции RegSetValueEx () всегда равен 0.
Public Sub SetRegistryValue ()
Dim lReturn As Long
Dim hSubKeyHandle As Long
Dim sSubKeyName as String
Dim sValueName As String
Dim sValue As String
sSubKeyWame = "SOFTWARE\Использование VBA\Win32 API\Обзop"
'Открытие ключа и получение его дескриптора
lReturn = RegOpenKey(HKEY_LOCAL_MACHINE, sSubKeyNaine, hSubKeyHandle)
If lresult <> 0 Then Exit Sub
'Установка первого значения
sValueMame = "Скучно?"
sValue = "Нет"
lValueSize = Len (sValue)
lReturn = RegSetValueEx (hSubKeyHandle, sValueName, 0, REG_SZ, sValue, lValueSize)
'
Установка второго значения
lsValueName = "Весело?"
sValue = "Конечно"
lValueSize = Len (sValue)
lReturn = RegSetValueEx (hSubKeyHandle, sValueName, 0, REG_SZ, sValue, lValueSize)
End Sub