Windows api функции для vba

Windows api функции для vba

Программный код большинства примеров данной лекции можно найти в проектах, доступных для просмотра: DocOne6, DocTwo6.

Несколько слов об API, Win32, DLL

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

Win32 — это название интерфейса, ориентированного на 32-х разрядные приложения и реализованного на таких известных платформах как Windows 95, Windows 98, Windows NT, Windows CE. Функции, составляющие этот интерфейс, позволяют прикладной программе получать доступ к ресурсам операционной системы и управлять ее работой. Более ранние версии Windows используют интерфейс, известный как Win16. Конечно, не все функции, составляющие интерфейс Win32, реализованы в полной мере на всех платформах, так что вызов одной и той же функции под NT приведет к определенному результату, а под Windows 95 работает как вызов заглушки. Любое из приложений, работающее в среде Windows, прямо или косвенно вызывает функции, входящие в Win32 API.

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

  1. Kernel32.dll. Эта библиотека предназначена для работы с объектами ядра операционной системы и ее функции позволяют управлять памятью и другими системными ресурсами.
  2. User32.dll. Здесь сосредоточены функции для управления окнами — основным видом объектов операционной системы. Обработка сообщений, работа с меню, таймерами, все это выполняют функции этой DLL .
  3. GDI32.dll. Эта библиотека, обеспечивающая графический интерфейс операционной системы (Graphics Device Interface). Функции управления выводом на экран дисплея, управления выводом принтера, функции для работы со шрифтами — все они входят в состав этой библиотеки.

Заметьте, Win API функции находятся не только в этих библиотеках. С другой стороны API функции не обязательно входят в состав Win32 интерфейса. Например, MAPI интерфейс (Messaging Application Programming Interface) составляют функции, предназначенные для обработки сообщений электронной почты, TAPI (Telephone API) — функции работы с телефонными сообщениями. MAPI, TAPI, также как и Win32 это некоторый набор функций, задающий определенный стандарт взаимодействия

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

.VBA и Win32 API

Работая на VBA, неявно всегда приходится иметь дело с функциями Win32 API, только вызов их упрятан в вызываемых VBA функциях или методах объектов Office 2000. Так, например, при работе с объектом Shape так или иначе будут вызываться функции GDI32, обеспечивающие работу с графикой, при работе c функциями VBA.Interaction , например GetSettings , SaveSettings и другими, будет вызываться соответствующие функции работы с реестром Windows, хранящиеся в библиотеках User32 и advapi32 . Такой косвенный вызов имеет свои преимущества, обеспечивая определенную безопасность в работе VBA программ. Но в ряде случаев VBA программисту необходим доступ ко всем возможностям операционной системы, предоставляемым Win32 API интерфейсом. Естественно, в этом случае он понимает, что на него ложится большая ответственность в обеспечении корректного вызова функций, поскольку ошибки в вызове могут привести к непредвиденным отказам в работе программы.

Вызов функций и оператор Declare

Элементы ActiveX , COM объекты могут экспонировать свой интерфейс, — свои свойства и методы. Это означает, что они уведомляют, предоставляют информацию клиентам о своем интерфейсе. Технически это обеспечивается тем, что эти объекты, наряду с DLL , сопровождаются TypeLib — библиотекой типов, в которой содержится в требуемом виде информация об интерфейсе объекта. В этом случае, для того чтобы начать работу с объектом, достаточно подключить ссылку на эту библиотеку в меню Tools|References в среде редактора VBE. Эта возможность не раз обсуждалась, когда речь шла о вызове, например, приложения Excel в документах Word. Напомним, что приложения Office 2000 представляют собой ActiveX объекты, построенные на основе COM технологии. Они явно экспонируют свой интерфейс, именно поэтому нет проблем при работе с такими приложениями, вызовами свойств и методов их многочисленных объектов. Библиотеки, составляющие Win32 интерфейс, не сопровождаются библиотеками типов TypeLib . Поэтому необходимо самому программисту уведомить VBA о том, где найти и как следует вызывать ту или иную функцию Win32 API Вызову каждой функции должен предшествовать оператор Declare , описывающий эту функцию. Этот оператор и сама схема вызова библиотечных функций используется при работе с любыми DLL , а не только с теми, которые содержат Win32 API функции. В общем случае в DLL могут храниться как функции, так и процедуры. Два варианта вызова этого оператора соответствуют ссылке на процедуру и на функцию, возвращающую значение. Первый вариант:

Читайте также:  Episode для mac os

Во втором случае его синтаксис:

В этих вызовах ключевые слова и параметры имеют следующий смысл:

  • Ключевое слово Public используется, чтобы сделать объявляемую процедуру доступной всем модулям проекта; ключевое слово Private ограничивает доступ к объявленной процедуре лишь модулем, в котором она объявлена. Заметьте, в стандартном модуле можно использовать оба описателя, но в модуле класса разрешается использовать только описатель Private .
  • Ключевое слово Sub в первом случае означает, что речь идет о процедуре; альтернативный ключ Function во втором случае указывает на функцию, возвращающую значение, которое может быть использовано в выражениях.
  • Обязательный параметр имя является именем объявляемой процедуры или функции. Это имя используется при вызовах в VBA программах. Оно может совпадать или отличаться от того имени, под которым процедура (функция) хранится в DLL . Заметьте, для имен функций Win32 API в отличие от Win 16 имеет значение различие между прописными и строчными буквами.
  • После обязательного ключевого слова Lib должно следовать в кавычках имя-библиотеки , содержащей объявляемую процедуру.
  • Ключ Alias позволяет указать, что процедура имеет в DLL другое имя — » псевдоним «, благодаря чему можно избежать коллизии имен в программе. Если первый символ параметра » псевдоним » не является признаком числа ( # ), псевдоним понимается как имя входной точки DLL для данной процедуры; если же первый символ псевдонима — ( # ), следующие за ним число должно задавать порядковый номер входной точки процедуры в DLL . Дело в том, что процедура может иметь несколько точек входа.
  • Необязательный список параметры задает список параметров, передаваемых процедуре при вызове.
  • As возвращаемый-тип во втором варианте оператора задает тип значения, возвращаемого функцией; им может быть любой из базисных типов VBA (не допускаются только строки фиксированной длины), тип объекта или определенный пользователем тип.
  • Список параметры — это список разделенных запятыми параметров процедуры; каждый элемент этого списка имеет вид:
  • Здесь ключ Optional означает, что данный параметр необязателен; при этом все следующие в списке параметры должны быть необязательными и сопровождаться этим же ключом Optional . Этот ключ нельзя применять, если среди параметров есть массив параметров ParamArray .
  • Ключевые слова ByVal и ByRef указывают на то, что параметр передается по значению или по ссылке; по умолчанию в VBA предполагается передача значения по ссылке ( ByRef ).
  • Ключевое слово ParamArray позволяет задать массив элементов типа Variant ; этот параметр должен быть последним в списке и не должен перед собой иметь ключей ByVal , ByRef или Optional ; такой массив позволяет передавать в процедуру произвольное (заранее неизвестное) число параметров.
  • Переменная — произвольное допустимое в VBA имя переменной; пустые скобки () после имени переменной означают, что соответствующий параметр — массив.
  • Необязательное определение As тип задает тип параметра, значения которого могут быть такими же, как и у описанного выше определения возвращаемый-тип . Задав произвольный тип ( As Any ), Вы исключите проверку при передаче параметра процедуре.

Вот пример задания оператора Declare для двух функций Win32 API:

Синтаксически оператор Declare прост и понятен, нужно указать библиотеку, имя функции, под которым она будет вызываться в VBA программе, ее имя (псевдоним) под которым она записана в библиотеке и параметры функции в привычном синтаксисе. Однако реальная жизнь не так проста и в организации вызова функций API есть много подводных камней. Дело в том, что DLL служат средством межязыкового взаимодействия. Сама DLL может быть разработана на одном языке, а вызываться в другом. Тогда возникает проблема правильной передачи параметров, поскольку может не быть точного соответствия между типами данных двух используемых языков. Функции Win32 API разработаны в ориентации на синтаксис языка C и C++. Поэтому при записи оператора Declare требуется корректно указать типы параметров, так чтобы они соответствовали типам, используемым в языке C. Еще одна проблема состоит в том, что помимо оператора Declare , в ряде случаев необходимо предварительно описать требуемые типы данных и константы, необходимые в процессе вызова функции. Так что, прежде чем вызвать функцию из DLL , необходимо корректно задать оператор Declare , описать необходимые типы и константы, — все это может быть не столь простой задачей.

Windows api функции для vba

06.04.2005
Читайте также:  Windows server открыть порт 8080

Вступление . Дорогой друг. Перед тобой попытка сделать максимально понятное и доступное пособие по 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».

Читайте также:  Djvu reader pdf reader для windows

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

Оцените статью