Windows api find dll

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

Часть 1

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 определяется следующим вариантами:

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

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

  • Огромное число 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 году, нам привез из США приятель, который предупредил перед отъездом, что у него не будет времени заниматься поиском книги. Однако потом он сообщил, что нашел ее в первом же книжном магазине небольшого провинциального городка.

    Читайте также:  Загрузочная консоль восстановления windows

    Эта книга объемом свыше 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 реализован в виде динамических 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 и файлов их содержащих — достаточно сложно (но все они находятся в системном каталоге). В этом плане лучше выделить состав библиотек, составляющих ядро операционной системы, и основных библиотек с ключевыми дополнительными функциями.

      Библиотеки Win32 API ядра операционной системы Windows 95/98:

      • KERNEL32.DLL: низкоуровневые функции управления памятью, задачами и другими ресурсами системы;
      • USER32.DLL: здесь в основном находятся функции управления пользовательским интерфейсом;
      • GDI32.DLL: библиотека Graphics Device Interface — разнообразные функции вывода на внешние устройства;
      • COMDLG32.DLL: функции, связанные с использованием диалоговых окон общего назначения.

      Использование DLL и Windows API

      П Библиотеки динамической компоновки (DLL)

      О Правила вызова DLL

      П Программа API Viewer

      О Использование функций API в приложениях

      О Создание класса WavePlayer

      О Работа с системной панелью Visual Basic позволяет наделить приложение широкими возможностями при минимальных затратах времени на программирование. И все же в некоторых ситуациях стандартных средств Visual Basic оказывается недостаточно. К счастью, Microsoft потратила немало усилий на то, чтобы встроить широкие функциональные возможности в операционную систему Windows. Немного творческого подхода при программировании — и вы сможете укротить Windows API и дать своим приложениям то, чего им не хватает!

      Общие сведения о библиотеках динамической компоновки (DLL)

      Рано или поздно вам потребуется сделать нечто, выходящее за пределы возможностей Visual Basic — или, по крайней мере, требующее очень сложного кода. В такой ситуации у вас есть три выхода:

      О написать нужный фрагмент на другом языке (например, С) и вызвать его из Visual Basic;

      О управлять работой другого приложения средствами OLE Automation;

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

      ПРИМЕЧАНИЕWindows API представляет собой набор DLL-библиотек с тысячами подпрограмм, которые программист может вызывать из своих приложений. Эти библиотеки являются важной частью операционной системы Windows.

      В этом уроке мы обсудим последний вариант, потому что тонкости программирования на С и C++ выходят за рамки этой книги, a OLE Automation лучше не трогать до тех пор, пока вы не освоите основы программирования на Visual Basic. Чтобы воспользоваться услугами Windows API, необходимо подключить к вашей программе библиотеки динамической компоновки, или DLL. DLL представляют собой компоненты приложений, объединяющие несколько функций в файле, который связывается с программой и используется ею во время выполнения. Функции DLL не внедряются в приложение. DLL представляет собой откомпилированный код (наподобие классов, описанных в уроке 4). Такая возможность чрезвычайно полезна, если вы хотите воспользоваться чьим-то готовым кодом или уменьшить размер своей программы. Операционная система Windows работает по тому же принципу. Она состоит из множества DLL и нескольких программ, которые пользуются услугами этих DLL. Примером могут служить диалоговые окна Open/Save, появляющиеся при открытии и закрытии документов. Вы замечали, что во всех приложениях эти окна выглядят одинаково? Здесь нет ничего удивительного, поскольку они действительно совпадают. Диалоговое окно вызывается из DLL, поэтому им можно пользоваться в любой программе.

      Многие программисты-новички считают Windows API чем-то вроде большого «черного ящика», который трудно понять и еще труднее использовать. В действительности API представляет собой набор DLL, обеспечивающих функциональные возможности операционной системы Windows. Заранее откомпилированные средства API находятся в вашем полном распоряжении — при условии, что вы знаете, что вам требуется, где найти нужную функцию и как ее вызвать. Одни DLL находятся в подкаталоге \Windows\System, другие — в основном каталоге Windows или других его подкаталогах.

      Win32, последняя версия этого API, состоит исключительно из 32-разрядных функций. Они обрабатывают информацию намного эффективнее, чем существовавшие раньше 16-разрядные версии. Для обеспечения обратной совместимости также был сохранен 16-разрядный код API, вызываемый старыми приложениями. API можно рассматривать как набор функций в DLL с документированными правилами вызова.

      Правила вызова DLL

      Вызов DLL может выглядеть довольно сложно (особенно если вы незнакомы с типами данных языка С). К счастью, DLL, составляющие Windows API, хорошо документированы, а код для объявления их функций включен в Visual Basic. Перед тем как пользоваться функцией DLL, ее необходимо объявить.

      Чтобы сообщить Visual Basic о своем желании обратиться к DLL, вы объявляете процедуру и указываете типы ее параметров. После этого ваша программа может вызвать нужную функцию DLL. На основании объявления Visual Basic поймет, как передавать информацию в DLL и получать результаты. Windows API содержит чрезвычайно мощный и полезный набор функций, но им не хватает устойчивости. Всего одна ошибка в типе параметра — и ваша программа начинает работать со сбоями, неожиданно завершается и даже «подвешивает» систему. Все это может привести к неприятным последствиям, особенно если вы не привыкли часто сохранять свою работу. Нарушение правил вызова DLL чаще всего приводит к сбою системы,

      ВНИМАНИЕПри работе с DLL сохраняйте свою работу перед каждым пробным запуском. Ошибка при вызове DLL может нарушить работу компьютера, и вы потеряете все, что успели сделать!

      Перед обращением к Windows API следует определить, какая функция вам нужна. После того как ее имя станет известно, следует объявить ее в программе. Для этого применяется оператор Declare, например:

      Private Declare Function sndPlaySound Lib «winmm.dll» Alias «sndPlaySoundA» (ByVal IpszSoundName As String, ByVal uFlags As Long) As Long Возможно, этот фрагмент выглядит устрашающе, но на самом деле понять его не так уж сложно — достаточно лишь знать правила вызова DLL. Здесь объявляется функция API с именем sndPlaySound, предназначенная для воспроизведения WAV-файла. Давайте рассмотрим этот фрагмент и выясним, что в нем происходит.

      Смысл правил вызова 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

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

      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) или игру, использование звука становится почти что обязательным.

      Изменение функции API

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

      Public Sub PlayWav(filename As String, soundon As Boolean) Dim rc As long

      If soundon = True Then

      rc = sndPlaySound(filename, 1) End If End Sub

      Эту полезную процедуру можно добавить в вашу библиотеку. При желании попробуйте инкапсулировать ее в специальном классе для работы с WAV-файлами. Глав-

      ное, о чем следует помнить, — пользователь должен иметь возможность отключить звук. Хотя многие предпочитают работать со звуком, со временем это может надоесть. Значение, определяющее выбор пользователя, передается процедуре PlayWav. Кроме того, звук отключается и в том случае, если на вашем компьютере не установлены средства мультимедиа (хотя это маловероятно).

      Создание класса WavePlayer

      Вы научились воспроизводить WAV-файлы средствами Windows API. Следующим шагом станет создание универсального класса WavePlayer, который можно будет включать в будущие проекты. Класс достаточно прост, но его легко расширить, например добавить возможность управления громкостью звука. Наш класс Wave Player содержит два свойства и один метод. Он создается следующим образом:

      1. Создайте новый проект командой File > New Project. Выберите тип проекта Standard EXE.

      2. Задайте свойству Name формы Form1 значение frmMain, а свойству Caption — значение WavePlayer.

      3. Создайте кнопку на форме frmMain. Задайте ее свойству Name значение cmdPlay, а свойству Caption — значение &Воспроизвести.

      4. Включите в класс новый модуль класса. Для этого щелкните правой кнопкой мыши в окне проекта и выполните команду Add > Class Module из контекстного меню.

      5. В открывшемся диалоговом окне Add Class Module выберите значок Class Module и нажмите кнопку Open.

      6. В окне свойств задайте свойству Name созданного класса значение WavePlayer.

      7. Включите следующий фрагмент в секцию (General)(Declarations) класса WavePlayer:

      Private mFilename As String Private mFlags As Long

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

      8. Добавьте следующие процедуры, образующие интерфейс к свойству Filename:

      Public Property Get Filename() As String

      filename = mFilename End Property

      Public Property Let Filename(ByVal vNewValue As String)

      mFilename = vNewValue End Property

      9. Добавьте следующие процедуры, образующие интерфейс к свойству Flags:

      Public Property Get Flags() As Long

      Flags = mFlags End Property

      Public Property Let Flags(ByVal vNewValue As Long)

      mFlags = vNewValue End Property

      10. Добавьте следующий фрагмент единственного метода класса:

      Public Sub Play() Dim rc As Long

      rc = sndPlaySound(mFilename, mFlags) End Sub

      11. Сохраните проект. Если вы создали программную библиотеку в уроке 4, сохраните файл WavePlayer.cls в каталоге библиотеки, что упростит его повторное использование в будущем. Оставьте файл проекта в исходном каталоге.

      12. Откройте окно программы для frmMain и перейдите в секцию (General) (Declarations).

      13. Чтобы воспользоваться объектом WavePlayer, необходимо создать ссылку на него. Добавьте следующий фрагмент:

      Private wav As WavePlayer

      14. Ссылка на объект имеется, теперь мы должны создать экземпляр указанного класса. Лучше всего сделать это в процедуре события Form_Load. Вставьте в процедуру следующий фрагмент:

      Private Sub Form_Load()

      Set wav = New WavePlayer End Sub

      15. При завершении работы приложения объект WavePlayer необходимо уничтожить. Для этого вы присваиваете ему Nothing и таким образом освобождаете занимаемую им память. Вставьте следующий фрагмент в процедуру события Form_Unload:

      Private Sub Form_Unload(Cancel As Integer)

      Set wav = Nothing End Sub 16. Наконец, вставьте следующий фрагмент в процедуру события cmPlay_Click. В нем объект WavePlayer непосредственно воспроизводит WAV-файл:

      Private Sub cmdPlay_Click() With wav

      .Filename = App.Path & «\Tada.wav» .Flags = 1 .Play End With End Sub

      ПРИМЕЧАНИЕПеред запуском приложения скопируйте воспроизводимый файл (в нашем примере — tada.wav) в каталог проекта. При желании можно легко заменить этот файл любым другим, который вы хотите услышать.

      7. Сохраните и запустите приложение.

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

      Работа с системной панелью

      Некоторые приложения, написанные для Windows 95 и Windows NT версии 4, ра-отают в системной панели — небольшой прямоугольной области, расположенной в правой части панели задач (см. рисунок). На системную панель часто помещаются приложения, управляющие различными устройствами

      или работающие по расписанию. Скорее всего, на вашем компьютере в системной панели находятся часы и, возможно, значок с динамиком для регулировки громкости. 3 комплект Visual Basic входит пример, который компилируется в элемент ActiveX. Мы воспользуемся им для того, чтобы поместить приложение на системную панель.

      Издание элемента SysTray

      Перед тем как пользоваться элементом ActiveX в приложении, необходимо отком-шлировать его и сохранить в подкаталоге \System каталога Windows. Элемент троится так:

      Откройте проект Systray.vbp из каталога \Cornmon\Tools\VB\Unsupprt\Systray на компакт-диске Visual Basic.

      В окне проекта откройте папку Modules и дважды щелкните на строке mSysTray, чтобы открыть модуль в окне программы.

      Просмотрите секцию (Global)(Declarations) модуля. Обратите внимание на объявления нескольких функций API, среди которых — CallWindowProc, GetWindowLong и Shell_NotifyIcon (рис. 19.5). Наряду с прочими они помещают значок программы на системную панель. Мы не будем подробно рассматривать тонкости их работы, однако вы можете просмотреть исходный текст программы и ознакомиться с комментариями, чтобы понять, как работает данный элемент.

      Рис. 19.5. Объявления функций API

      3. Выполните команду File > Make Systray.ocx.

      4. В диалоговом окне Make Project укажите в поле Save In подкаталог \System каталога, в котором установлена система Windows. На большинстве компьютеров это будет C:\Windows\System.

      5. Нажмите кнопку О К, чтобы завершить компиляцию элемента.

      Элемент SysTray готов к работе.

      Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰).

      Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого.

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

      Читайте также:  Sudo apt install unetbootin kali linux
    Оцените статью