Visual2000 · Архив статей А.Колесова & О.Павловой

Работа с функциями Windows API и DLL

Часть 1

Андрей Колесов

© Андрей Колесов, 2000
Авторский вариант. Статья была опубликована c незначительной литературной правкой в журнале "КомпьютерПресс" N 09/2000, с.79-87.


Windows API — наиболее важная и мощная дополнительная библиотека функций, доступная каждому VB-программисту. Многие из них, в том числе и опытные разработчики работают с ними, используя простые готовые решения, почерпнутые в различных книгах и журналах (возможно, также и в нашей постоянной рубрике "Советы для тех, кто программирует на VB"), не очень задумываясь о сути этой технологии. Такой подход является достаточным при решении простых задач, но для серьезной работы предпочтительнее более детально разобраться с основными принципами использования функций Windows API. Чем мы сейчас и займемся.

Windows API — набор функций операционной системы

Аббревиатура API для многих начинающих программистов выглядит весьма таинственно и даже пугающе. На самом же деле Application Programming Interface (API) — это просто некоторый готовый набор функций, который могут использовать разработчики приложений. В общем случае данное понятие эквивалентно тому, что раньше чаще называли библиотекой подпрограмм. Однако чаще всего под API подразумевается некоторая особая категория таких библиотек.

В ходе разработки практически любого достаточно сложного приложения (MyAppication) для конечного пользователя формируется набор специфических внутренних функций, используемых для реализации данной конкретной программы, который называется MyApplication API. Часто оказывается, что эти функции могут эффективно использоваться также для создания других приложений, в том числе другими программистами. В этом случае авторы исходя из стратегии продвижения своего продукта должны решить вопрос — открывают ли они доступ к этому набору для внешних пользователей или нет? При положительном ответе на него в описании программного пакета, как его достоинство, появляется фраза о том, что "комплект включает открытый набор API-функций" (но иногда за дополнительные деньги).

Таким образом, чаще всего под API подразумевается набор функций, являющийся частью одного приложения, но при этом доступных для использования в других программах. Например, Excel кроме интерфейса для конечного пользователя имеет набор функций Excel API, который может использоваться, в частности, при создании приложений с помощью VB.

Соответственно, Windows API — это набор функций, являющийся частью самой операционной системы и в то же время — доступной для любого другого приложения, в том числе написанного с помощью VB. И в этом плане вполне оправдана аналогия с набором системных прерываний BIOS/DOS, который фактически представляет собой DOS API

Отличие заключается в том, что состав функций Windows API, с одной стороны значительно шире, по сравнению с DOS, с другой — не включает многие средства прямого управления ресурсами компьютера, которые были доступны программистам в предыдущей ОС. Кроме того, обращение к Windows API выполняется с помощью обыкновенных процедурных обращений, а вызов функций DOS — через специальную машинную команду процессора, которая называется Interrupt ("прерывание").

Win16 API и Win32 API

Как известно смена Windows 3.x на Windows 95 ознаменовала собой переход от 16-разрядной архитектуры операционной системы к 32-разрядной. Одновременно произошла замена 16-разрядного Windows API (Win16 API) на новый 32-разрядный вариант (Win32 API) — о некоторых вопросах этого перехода будет говориться в этой статье. В данном случае нужно просто иметь в виду, что за небольшим исключением набор Win32 API является единым для семейств Windows 9x и Windows NT.

Далее под термином API будет подразумеваться Win API и более того, по умолчанию — Win32 API.

В начало статьи

Зачем нужен Win API для VB-программистов

Несмотря на то, что VB обладает огромным множеством разнообразных функций, при более-менее серьезной разработке обнаруживается, что их возможностей часто не хватает для решения необходимых задач. При этом программисты-новички часто начинают жаловаться на недостатки VB и подумывать о смене инструмента, не подозревая, что на их компьютере имеется огромный набор средств и нужно только уметь им воспользоваться.

При знакомстве с Win API обнаруживается, что многие встроенные VB-функции — не что иное, как обращение к соответствующим системным процедурам, но только реализованные в виде синтаксиса данного языка. Учитывая это, необходимость использования API определяется следующим вариантами:

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

  2. Встроенные VB-функции реализуют лишь частный случай соответствующей API-функции. Это довольно обычный вариант. Например, API-функция CreateDirectory обладает более широкими возможностями по сравнению с встроенным VB-оператором MkDir.

  3. Огромное число API-функций вообще не имеют аналогов в существующем сегодня варианте языка VB. Например, удалить каталог нельзя средствами VB — для этого нужно использовать функцию DeleteDirectory.

Следует также подчеркнуть, что некоторые API-функции (их доля в Win API весьма незначительна) не могут вызываться из VB-программ из-за ряда ограничений языка, например отсутствие возможности работы с адресами памяти. Но в ряде случаев могут помочь нетривиальные приемы программирования (в частности, в случае с теми же адресами).

Личная точка зрения автора такова — вместо расширения от версии к версии встроенных функций VВ, было бы полезнее давать хорошее описание наиболее ходовых API-функций. В то же время разработчикам нужно иметь в виду, что вместо ожидания новой версии средства с расширенными функциями лучше внимательнее изучить состав существующего Win API — вполне вероятно, что нужные вам возможности можно было реализовать еще в версии VB 1.0 1991 года выпуска.

В начало статьи

Как изучать Win API

Это не такой простой вопрос, если учесть что число функций Win32 API оценивается величиной порядка 10 тысяч (точной величины никто не знает, даже Microsoft).

В состав VB (версий 4-6) входит файл с описанием объявлений Win API — WIN32API.TXT (о его применении мы расскажем подробнее позднее). Но, во-первых, с его помощью можно получить сведения о назначении той или иной функции и ее параметрах только по используемым мнемоническим именам, а во-вторых — перечень функций в этом файле далеко не полный. В свое время (семь лет назад) в VB 3.0 имелись специальные справочные файлы, с описанием функций Win16 API. Однако уже в 4.0 эта полезная информация с удобным интерфейсом исчезла.

Исчерпывающая информация о Win32 API находится в справочной системе Platform Software Development Kit, которая в частности находится на компакт-дисках MSDN Library, включенных в состав VB 5.0 и 6.0 Enterprise Edition и Office 2000 Developer Edition. Однако нужно признаться, что найти там нужную информацию и разобраться в ней совсем не просто. Не говоря уж о том, что все описания там приводятся применительно к языку C.

Общепризнанным лучшим в мире пособием для изучения API-программирования в среде VB являются книги известного американского эксперта Даниэля Эпплмана (Daniel Appleman). Его книги серии "Dan Appleman's Visual Basic Programmer's Guide to the Windows API" (для Win16, Win32, применительно к разным версиям VB) с 1993 года неизменно входят в число бестселлеров для VBпрограммистов. Книгу "Dan Appleman's VB 5.0 Programmer's Guide to the Win32 API", выпущенную в 1997 году, нам привез из США приятель, который предупредил перед отъездом, что у него не будет времени заниматься поиском книги. Однако потом он сообщил, что нашел ее в первом же книжном магазине небольшого провинциального городка.

Эта книга объемом свыше 1500 страниц включает описание общей методики API-программирования в среде VB, а также более 900 функций. Прилагаемый компакт-диск содержит полный текст книги и всех программных примеров, а также несколько дополнительных глав, не вошедших в печатный вариант. В 1999 году Дэн Эпплман выпустил новую книгу "Dan Appleman's Win32 API Puzzle Book and Tutorial for Visual Basic Programmers", которая включает сведения о еще 7600 функциях (хотя и не столь подробные). (подробнее о книге можно прочитать по адресу www .visual.2000.ru\develop\vb\books-vb\80531api.htm.

В начало статьи

Win API и Dynamic Link Library (DLL)

Набор Win API реализован в виде динамических DLL-библиотек. Таким образом далее сейчас мы будем фактически говорить о технологии использования DLL в среде VB на примере библиотек, входящих в состав Win API. Однако говоря о DLL необходимо сделать несколько важных замечаний.

В данном случае под DLL мы подразумеваем традиционный вариант двоичных динамических библиотек, которые обеспечивают прямое обращение приложений к нужным процедурам — подпрограммам или функциям (примерно также как это происходит при вызове процедур внутри VB-проекта). Такие библиотеки могут создаваться с помощью разных инструментов — VC++, Delphi, Fortran, Assembler. VB не может пока (посмотрим, что появится в версии 7.0) создавать такие DDL, он может делать ActiveX DLL, доступ к которым выполняется через интерфейс OLE Automation.

Обычно файлы динамических библиотек имеют расширение .DLL, но это совсем не обязательно. Для Win16 часто применялось расширение .EXE, драйверы внешних устройств обозначаются с помощью .DRV.

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

А теперь несколько Советов: Продолжение статьи, Часть 2

В начало статьи