Статья для новичков в разработке Windows приложений с использованием API функций, короче - для тех, кто не знаком с Win32 API.
После того, как Вы освоились с возможностями Visual Basic, разрабатываете приложение и, вдруг, требуется обратиться непосредственно к самой системе и иё функциям? Например, чтобы получить координаты мыши за пределами вашей формы. Доступ к этим функциям предоставляется интерфейсом прикладных программ - Win32 API (Application Programming Interface).
Win32 API - это набор функций, используемых программистами, работающими на языке C. Но в Visual Basic'е траблов с API нет (я не сталкивался, хотя, в руководстве Апплемана по API есть некоторые упоминания). Проблемы у новичков с API функциями должно вызывать описание самих функций и объявлений типов данных, т.к. я уже говорил, что функции ориентированы на C.
Цель этой статьи - ознакомление с основами обращений к API. Для просмотра и объявления основных функций можно воспользоваться API Viewer'ом. Основные функции находятся в файле Win32API.txt. Существуют дополнительные файлы, ориентированные для более широкой работы с API. Скачать с сайта можно здесь.
Для использования API функции необходимо сообщить VB имя и местоположение DLL библиотеки, в которой находится нужная функция, указать типы и параметры. Для объявления функции используется оператор Declare.
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As LongDeclare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
API функция GetUserName находится в библиотеке advapi32.dll, в системной папке Windows. Суффикс A - это наследство, оставшееся от старых версий API, в которых существовали 16 и 32-х разрядные функции. Ниже приведена таблица структуры данных на C и эквивалентов на VB.
Объявление C
Данные на VB
Способ передачи
Integer
Integer
ByVal
Integer Pointer (LPINT)
Integer
ByRef
Long
Long
ByVal
Long Integer Pointer
Long
ByRef
String Pointer (LPSTR)
String
ByVal
Handle
Long
ByVal
Char
String
ByVal
Void Pointer
Any
ByRef
Когда параметры передаются по значению, вызываемая процедура работает с локальными копиями переменных. Процедура получает их значения, но не может изменить значение самой переменной. В Visual Basic'е для обозначения такого способа передачи используют слово ByVal. При выходе из процедуры исходное значение переменной восстанавливается.
При передаче параметров по ссылке процедуре предоставляется доступ к переменной в вызывающей программе, процедура получает адрес области памяти, хранящей значение параметра. Это даёт возможность изменять значение параметра.
В некоторых API функциях в качестве параметров используются структуры.
Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long
Private Type POINTAPI x As Long y As Long End Type
Эта функция используется для определения информации о положении курсора мышки. Она должна возвращать значения X и Y. Эти значения находятся в структуре POINTAPI. Чтобы получить их значения воспользуйтесь следующим кодом:
Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long
Private Type POINTAPI x As Long y As Long End Type
Private Sub MouseTmr_Timer() 'таймер с интервалом 100 Dim Cords as POINTAPI GetCursorPos Cords Caption = "X: " & Cords.x & " , Y: " & Cords.Y End Sub