Смысл правил вызова DLL

Объявления различных функций API обладают рядом общих черт. Мы последовательно рассмотрим каждую из них, чтобы лучше понять смысл происходящего.

Выбор области видимости

Область видимости для функций API определяется точно так же, как и для любых других процедур, написанных на Visual Basic. Ключевое слово Public открывает функцию для всего приложения, а ключевое слово Private ограничивает доступ к ней текущей формой.

В приведенном выше фрагменте функция API объявляется закрытой по отношению к текущему модулю. Она ничем не отличается от других закрытых функций, написанных вами (см. урок 4), — разве что в данном случае вы не создаете функцию, а вызываете ее из своей программы.

Объявление DLL

Оператор Declare Function сообщает Visual Basic, что к приложению необходимо подключить функцию sndPlaySound из файла winmm.dll Ключевое слово Alias указывает имя функции, которое используется внутри DLL. Оно обеспечивает совместимость между стандартной 16-разрядной и 32-разрядной версиями API.

Типы параметров

Параметры могут передаваться по значению и по ссылке. При передаче по значению (ключевое слово ByVal) функция получает текущее значение переменной. Если же переменная передается по ссылке (ключевое слово ByRef), функция находит в памяти область, в которой хранится данная переменная, и берет ее значение прямо оттуда. Тем самым обеспечивается совместимость с языками С и C++, поскольку большая часть API написана именно на этих языках.

ВНИМАНИЕ

По умолчанию параметры передаются DLL по ссылке. Чтобы передать переменную по значению, необходимо указать ключевое слово ByVal. Если не сделать этого, значение будет передано по ссылке, и функция будет работать неверно. Скорее всего, это приведет к нарушению работы программы.

После оператора Alias следует список параметров, передаваемых функции при вызове. В нашем примере оба параметра, lpszSoundName и uFlags, передаются по значению (ByVal). Параметр lpszSoundName соответствует строковой переменной

с полным именем файла формата.WAV. Параметр uFlags передает функции набор особых флагов, используемых в ее работе. Не обращайте внимания на префиксы lpsz и u — они подчиняются соглашениям об именах, принятым в С и C++. Наконец, функция возвращает длинное целое (Long), с помощью которого сообщает о том, успешно ли прошел вызов.

Код возврата

В последней строке объявления задается тип значения, возвращаемого функцией. Поскольку работа большинства функций API не видна пользователю, с помощью кода возврата они сообщают программе, успешно ли была вызвана функция, а в случае неудачи — причины сбоя. Эта информация важна, поскольку при работе с API программа зависит от вызываемых в ней функций. Если вызов функции API по какой-либо причине закончится неудачей, а ваше приложение не проверит код возврата и продолжит работу, скорее всего, дело кончится аварийным завер-

шением.

Раз уж мы заговорили о кодах возврата, необходимо сделать одно замечание. Вы можете использовать коды возврата в своих функциях для передачи информации в вызывающую программу. Более того, это считается «хорошим тоном», поскольку позволяет вашему приложению обмениваться информацией с компонентами. Во время программирования никогда не следует полагать, что процедура нормально сработала, — обязательно проверяйте код возврата. При этом снижается вероятность того, что ваше приложение начнет работать неверно из-за присвоения переменной ошибочного значения (или вообще никакого значения). Функции Windows API похожи на функции и процедуры, которые вы создаете в своих собственных приложениях, но у них есть одно существенное отличие: их код был написан заранее. Вам остается лишь позаботиться о правильном объявлении функций, а также использовании правильных типов параметров при обмене информацией. Если вы не проявите достаточной осторожности, ваши программы будут часто «падать» или, что еще хуже, «подвешивать» операционную систему.

API Viewer

Теперь вы знаете основные принципы объявления DLL, и я покажу, как упростить

работу. В комплект Visual Basic входит вспомогательная программа API Viewer

(рис. 19.1).

Она содержит сведения о большинстве функций, типов переменных и констант

Windows API, позволяет быстро найти вызываемую функцию и выдает готовый

фрагмент, который включается в приложение.

Работа с API Viewer происходит так:

1. Из меню Start запустите программу API Text Viewer из программной группы Visual Basic.

2. В API Viewer выполните команду File > Load Text File.

Рис. 19.1. API Viewer 3. Выберите файл Win32.api и нажмите кнопку Open.

ПОДСКАЗКА API Viewer быстрее загружает информацию об API, если преобразовать текстовый файл в базу данных. Это стоит сделать в том случае, если вы собираетесь часто работать с API Viewer. Чтобы преобразовать текстовый файл в базу данных, выполните команду File > Convert Text to Database и укажите имя базы в открывшемся диалоговом окне (рис. 19.2).

4. Нажмите кнопку Yes, чтобы преобразовать файл в базу данных.

5. Когда преобразование будет закончено, выберите из списка API Type (в верхней части окна) строку Declares.

П0ДСКАЗКА API Viewer также можно вызвать из меню Add-Ins Visual Basic

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

6. Найдите функцию sndPlaySound. Выделите ее и нажмите кнопку Add, чтобы включить объявление функции в список Selected Items (рис. 19.3).

Рис. 19.2. Преобразование текстового файла в базу данных

Рис. 19.3. Объявление функции sndPlaySound

7. Когда функция появится в списке, нажмите кнопку Сору. Объявление функции копируется в буфер обмена.

8. Закройте API Viewer. Использование функций API в приложениях

Мы узнали, как с помощью API Viewer получить объявление функции API для ваших программ. Давайте посмотрим, каким образом объявления интегрируются с приложениями. Продолжим с того момента, на котором закончился предыдущий пример:

1. Создайте новый проект в Visual Basic. Если откроется окно Project Wizard, вы-, берите в нем значок Standard EXE.

2. Дважды щелкните на форме Form1 в окне проекта — открывается окно программы.

3. Перейдите к секции (General)(Declarations) и выполните команду Edit > Paste. Примерный вид окна программы показан на рис. 19.4.

Рис. 19.4. Объявление функции API в окне программы

4, Вставьте перед Declare ключевое слово Private:

Private Declare Function sndPlaySound Lib "winmm.dll" _ Alias "sndPlaySoundA" (ByVal IpszSoundName As String, _ ByVal uFlags As Long) As Long

Обычно объявления функций API находятся в отдельном модуле. Тем не менее их также можно включить в форму или класс, но в этом случае перед Declare необходимо указать ключевое слово Private. Если этого не сделать, вы получите сообщение об ошибке.

5. Добавьте следующий фрагмент в процедуру события Form_Load() формы Form1: Private sub Form_Load()

Dim filename As String Dim rc As Long

filename = "c:\windows\media\tada.wav" rc = sndPlaySound(filename, 1) End Sub

ПРИМЕЧАНИЕ Вы можете изменить значение параметра filename и воспользоваться другим WAV-файлом. Приведенный выше фрагмент использован лишь в качестве примера. Также обратите внимание на то, что код возврата (rс) объявлен как длинное целое (Dim rc As Long). Тип переменной должен точно совпадать с типом, указанным в объявлении функции API. Параметры filename и flags также должны соответствовать объявлению. В своем примере я присвоил параметру flags значение 1.

6. Если все идет нормально, сохраните проект и запустите его.

ВНИМАНИЕ Всегда сохраняйте проект перед запуском, если вы используете функции Windows API. Всего один неправильный параметр может привести к нарушению работы системы и потере всех несохраненных данных.

Если на вашем компьютере установлена звуковая карта, а звук включен, вы услышите знаменитое «Та-да!». Немного поэкспериментируйте с параметром filename и попробуйте изменить его, чтобы воспроизвести другие звуковые файлы. С помощью этой функции API можно добавить звуковое оформление к вновь создаваемым программам. Может быть, ваши приложения будут содержать звуковые инструкции по своей работе. Если вы пишете программу сохранения экрана (screen saver) или игру, использование звука становится почти что обязательным.


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



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