Проверка описания

Примечание

При обращении к функции 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=lEnd Sub

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: