Часть 2. Использование API в VB.
На главную самоучителя
06.04.2005
Введение.
Общие сведения об API-функциях.
Объявление API. Использование файла объявлений Win32API.txt.

Вступление. Дорогой друг. Перед тобой попытка сделать максимально понятное и доступное пособие по API-функциям, чтобы даже совершенно неопытный программист мог использовать их в своих программах. Попытка эта может быть неудачной, но тем не менее в главах 2-й части самоучителя ты найдешь полезные сведения и приемы работы с API. Идея реализации этого не нова - разбор примеров с API с очень простым и ясным кодом. Однако общая концепция построения самоучителя будет корректироваться в процессе работы.
Хочу предупредить, что все примеры написаны и проверены под Windows XP Professional. Использование API в данном пособии предполагает использование 32-разрядных платформ (Windows 98/2000/NT/XP) и совместимых с Visual Basic 4.0 и выше.

Для чего вообще париться с API? Желание примененить API (Application Programming Interface), как мне кажется, в первую очередь предполагает возникновение у программиста задачи, которую невозможно реализовать внутренними возможностями VB. И второе - это просто интерес к API и тому, что можно сделать с помощью Windows - так сказать, спортивный интерес.
Можно, конечно, написать программу, состоящую чуть-ли не из одних API. Однако, как мне кажется, если есть возможность решить задачу средствами VB, то и нефиг пыжится с API. Тем более, что для многих функций API есть аналоги, уже встроенные в Visual Basic.
Использование API очень тесно связано с внутренним устройством Windows. Впрочем как и сам Visual Basic. Но в VB мы этого не замечаем, эта замечательная программа берет на себя почти все вопросы по "утряске" работы твоего приложения с твоей операционной системой. Совсем другое дело при работе с API. Хотя бейсик здесь тоже пытается не допустить фатальных ситуаций, вероятность возникновения трудноуловимых ошибок здесь гораздо выше. Хотя при правильном использовании API они достаточно надежны. Но и здесь возможно явное столкновение с извращениями компании Microsoft.
Данное пособие не ставит собой целью фундаментально изучать ее операционную систему. Да мы вообще ничего не изучаем,а так, балуемся. Поэтому, чтобы не туманить себе мозги мы будем по ходу использовать лишь крайне необходимые и вобщем-то общеизвестные сведения о Windows.

Что такое API и откуда они берутся? Ниоткуда они не берутся. Они есть на твоем компьютере, независимо от того, используем мы их или нет. Это просто функции, которые возвращают определенные значения. И все приложения Windows их постоянно используют для выполнения типовых задач. Физически они находятся в особых исполняемых файлах с расширенем .dll, которые называются библиотеками динамической связи. По большому счету мы можем использовать эти функции также, как и встроенные функции VB.
Вообще-то не все API могут быть вызваны из VB, так как их параметры несовместимы с Visual Basic. Все API написаны на языке C - чуждого по синтаксису и структуре языку VB. VB прост как носок, С - сложен как портянка. Именно поэтому объявления API-функций так неорганично вписываются в VB. Однако это никого не останавливает в их использовании.

Так как их использовать? А использование API начинается с их объявления. Неправильные объявления являются причиной большинства ошибок. Объявлять их предпочтительнее в стандартном модуле с ключевым словом Public, хотя, если проект простой, можно объявить их и в форме. Никогда не пиши объявления с клавиатуры. Копируй функцию из файла Win32API.txt или других надежных источников. Это сократит возможность появления ошибок в объявлении до минимума.

Сложно ли работать с API? Конечно, написанные в коде подряд тридцать-сорок объявлений API вызывают суеверный ужас обилем непонятных и общем-то странных циферок и буковок, которые никак не ассоциируются с VB. Однако при ближайшем рассмотрении каждой функции отдельно все выглядит не так страшно. Структура большинства функций более или менее одинакова и их применение потом вобщем-то тоже. Использование API по большому счету не представляет особых трудностей. Конечно здесь есть свои подводные камни и рифы и иногда мы результата-то не можем получить, а иногда и вообще повесим программу. Ну это издержки всякого программирования.
Давай посмотрим, из чего, приблизительно, состоит объявление API. Вот ее синтаксис:


Public/Private Declare Function Имя_функции Lib Библиотека Alias Псевдоним (Список_аргументов) As Тип

где
синим цветом выделен "скелет" объявления:
Public/Private - понятно, что ключевые слова. В коде формы функция объявляется с ключевым словом Private, в стандартном модуле - с Public, или вовсе без ключевого слова (но при этом использование функции будет возможно только в модуле).
Declare Function - команда, которая собственно объявляет функцию
Имя_функции - определяет то имя функции, с которым мы будем в дальнейшем работать в коде программы
Библиотека - определяет имя DLL-библиотеки (по сути имя файла), содержащей функцию
Псевдоним - как-бы второе имя функции, псевдоним, который можно использовать в VB, если Имя_функции по каким-то причинам (несовместимость синтаксиса, совпадение с именами команд и функций VB) не может быть использовано. Имеется не всегда.
(Список_аргументов) - это переменные строго определенного типа, которые мы передаем или получаем. Их имена для нас не имеют особого значения, поскольку мы все равно в программе используем свои.
Тип - тип значения, которое возвращает наша функция, а именно Byte, Long, Boolean, Integer, Single, Double, Currency, Date, String, Object, Variant. В объявлении определять тип возвращаемого значения можно и с помощью значка определителя типа (например типу Integer соответствует значок %), тогда секция Тип не нужна. Подробнее типы данных ты можешь посмотреть на странице "Типы данных, поддерживаемые VB".

Но на самом деле, из всего этого обилия, нам главным образом нужно Имя_функции, чтобы обратиться к нему в нашей программе и порядок и тип переменных в Списке_аргументов.
Реально же объявление функции GetWindowText, позволяющей получить заголовок окна будет выглядеть в соответствии с файлом Win32API.txt следующим образом:


Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

А если использовать значок определителя типа, то так:

Public Declare Function GetWindowText& Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long)

Обратите внимание,
что библиотека имеет только имя файла, без расширения .dll. Такое написание возможно только при использовании основных DLL (User32, Kernel32, и GDI32). В остальных случаях использование расширения dll в имени библиотеки обязательно.

Теперь, чтобы нам никогда-никогда не делать ошибок в объявлении API, научимся пользоваться справочным файлом Win32API.txt.

Добавление API в проект.

Исходя из того, что правильное объявление API является залогом нашего успеха, нам надо знать, где найти правильное объявление функции и откуда его скопировать. В стандартную поставку VB6 включен файл Win32API.txt. В нем имеются все объявления, константы и пользовательские типы. Но если ты откроешь его в текстовом редакторе, то офигеешь и сразу закроешь (можешь попробовать, он лежит обычно в C:\Program Files\Microsoft Visual Studio\Common\Tools\Winapi). Но нас простым финским ножом не испугаешь, поэтому мы хладнокровно воспользуемся утилитой API Viewer. И с ее помощью сможем очень быстро и легко находить и копировать объявления API-функций.
Сейчас мы попробуем практически этой утилитой добавить функцию в наш проект, а заодно эту самую утилиту настроим.
Для добавления утилиты в VB начните новый exe-проект и создайте в нем стандартный модуль Модуль1. Откройте модуль. В меню VB "Добавления" (Add-Ins) шелкните по "Менеджеру Дополнений" (Add-In Manager) рис.1.


Рисунок 1

У тебя появится "Менеджер Дополнений", в котором надо выбрать строку VB 6 API Viewer. Не забудь поставить две галочки "Загружено/Выгружено" и "Загрузить при запуске" (рис. 2). Тогда у тебя при каждом запуске VB будет присутствовать эта утилита. А поскольку ты читаешь эту главу, значит решился взяться за API всерьез, и эта утилита должна стать твоей любимой.

Рисунок 2.

После этих манипуляций у тебя в меню "Добавления" появится новая строка "API Viewer" (Рис.3). Вот по ней и щелкни.


Рисунок 3.

И перед тобой открывается искомая, замечательная утилита. Однако в нее надо загрузить этот самый файл Win32API.txt, чтоб было, на что посмотреть. Выбери в меню File строку Load Text File и в открывшемся окне найди этот файл. Теперь, естественно, жми Open. В поле Available Items у тебя появился список доступных API. Если нам надо, например, записать в наш проект функцию GetDesktopWindow, то мы в поле Type the first... пишем, конечно, первые буквы функции (getdes) и вот она, выехала, прямо перед нами. Щелкаем по кнопке Add и полное объявление функции появляется в поле Selected Items (рис 4). Жмем кнопку Copy (при этом объявление забирается в буфер), а потом особо не напрягаясь Insert. У тебя даже спросят, в Модуль1.bas ли надо вставлять функцию. Ты жмешь OK и у тебя в модуле готовое правильное объявление. Заметьте, что мы объявляем функцию в модуле, поэтому с ключевым словом Public (помечена строка Public). А вот если бы мы объявляли функцию в форме, то надо было бы пометить строчку Private.


Рисунок 4.

Ну тут можно добавить, что для быстроты поиска можно преобразовать текстовой файл в базу (.mdf), но тогда и грузить надо базу ("Load Database File"). А еще, для того, чтобы последний файл грузился автоматически, поставь галочку в меню View в строке "Load Last File".

Ну вот теперь мы полностью готовы к исследованию API, которое начнется в следующей статье.


Copyright © 2005 4us
Сайт создан в системе uCoz