Win32 Application Programming Interface (API) – библиотека, доступная каждому программисту, создающему приложения в среде Windows. Она используется для создания приложений для любых 32-разрядных операционных систем фирмы Microsoft.
При разработке приложений требуются средства формализации процесса повторного использования кода, с помощью которых разные разработчики могли бы использовать одни и те же коды программ.
В Microsoft Office шаблоны являются каркасами приложений, примером практической реализации принципа многократного использования программных компонентов.
Операционные системы Windows разрабатывались на основе модели WOSA (Windows Open Services Architecture – открытая архитектура служб Windows). В соответствии с этой концепцией API служит своего рода черным ящиком: все функции, используемые в Windows, вынесены «на всеобщее обозрение» (известны их имена, назначение, списки параметров, возвращаемые значения), но без описания деталей их реализации.
Все сервисы WOSA делятся на три группы:
– Базовые сервисы: Win32 API (позволяет использовать в приложениях практически любые функции Windows 95 или Windows NT); ODBC API (возможность связываться с любыми источниками данных независимо от разработчика); MAPI (Messaging API – реализация доступа к почтовым системам, использующим MAPI); TAPI (Telephony API – доступ к коммутируемым (телефонным) линиям); OLE API (поддержка связывания и внедрения объектов);
– Коммуникационные сервисы: Sockets API (доступ к сети с помощью различных сетевых протоколов); SNA API (открытый доступ к большим ЭВМ – мэйнфреймам фирмы IBM); RPC API (удаленный вызов процедур, позволяющий упростить разработку клиент/серверных распределенных систем);
– Сервисы вертикальных приложений (бизнес-сервисы) – расширения WOSA для систем электронной коммерции, обработки биржевой информации в реальном времени, для систем управления, разработки и производства.
Можно сказать, что Win32 API состоит из двух компонентов: библиотек динамической компоновки (DLL) и описаний к ним. Создание нового API сводится фактически к разработке новой библиотеки.
Использование функций Win32 API расширяет возможности VBA. Для подключения функций Win32 API их необходимо описать с помощью специальной инструкции Declare. Эта инструкция (описатель) сообщает программе, где находится требуемая функция API и как ее использовать. В описателе указывается следующая информация: имя функции, содержащая функцию DLL, передаваемые в функцию параметры, тип возвращаемых данных. Правило записи инструкции приведено ниже:
Declare Function | Sub Псевдоним Lib “ИмяБиблиотеки” _ [Alias “ИмяФункцииAPI”](СписокПараметров) _ [As ТипРезультата]
Основные библиотеки Windows 95 имеют следующее назначение: KERNEL32 – функции ядра ОС (низкоуровневые функции управления ресурсами и процессами), GDI32 – функции управления графическим интерфейсом, USER32 – функции для работы с окнами.
Если функция API возвращает данные строкового типа, необходимо указать буфер, представляющий собой переменную для хранения возвращаемой строки и число, определяющее длину буфера. Строки, возвращаемые функциями API, заканчиваются символом с кодом 0 (это ASCIIZ-код), поэтому размер буфера должен быть на 1 больше предполагаемой длины строки.
При передаче в функцию API строковой переменной она воспринимается как указатель. Для передачи в функцию пустого указателя в VBA используется значение 0& (нуль типа Long). При передаче в функцию пустого указателя необходимо внести в описатель функции изменения: тип аргумента можно указать как As Any, при этом в функцию можно передать как строковые переменные, так и переменные типа Long, если нужно.
Для облегчения работы с объектами в Windows используются их числовые идентификаторы. Существует вида типа таких идентификаторов: дескрипторы и указатели. Дескриптор – это специальное 32-битное целое число, которое используется Windows для идентификации объекта, например, окна или потока. Большинство функций Win32 API работает с дескрипторами. Указатель – это адрес объекта, переменной или структуры. VBA их не использует, но многие функции API требуют передачи указателей в качестве аргументов. При вызове данных функций из программы VBA необходимо использовать переменную того же типа, что и переменная, на которую ссылается указатель, и использовать ключевое слово ByRef в описании функции.
Текстовые строки всегда передаются в функции из библиотек DLL по ссылке. Ключевое слово ByVal для строковых аргументов задает преобразование строки в формат с окончанием на нулевой символ. Использование ключевого слова ByRefдля строковых аргументов недопустимо.
Ниже приведен пример использования функции GetSystemDirectory для получения полного имени системной папки Windows. В модуле, содержащем вызов функции, должен содержаться описатель:
Declare Function GetSystemDirectory Lib “KERNEL32” _
Alias “GetSystemDirectoryA” _
(ByVal lpBuffer As String , _
ByVal nSize As Long) As Long
Далее приведен пример процедуры, обращающейся к данной функции:
Sub Ex_GetSystemDirectory ()
Dim strBuffer As String
Dim intLen As Integer
‘ Выделение памяти для буфера (возвращаемой строки):