API в Visual Basic
Функции Win32 API - это функции, которые система Windows использует в своих целях и предоставляет другим языкам программирования пользоваться ими. Спектр применения этих функций весьма широк. Это работа с графикой, файлами, окнами и многое другое. Список функций применительно к VB можно посмотреть в поставляемом с VB файлом Win32Api.txt.Для использования API функции в VB проекте ее нужно вначале объявить. Например
Declare Function SetCurrentDirectory Lib "kernel32" Alias _"SetCurrentDirectoryA" (ByVal lpPathName As String) As LongSetCurrentDirectory - название функции в Вашей программе;
kernel32 - название библиотеки;
SetCurrentDirectoryA - действительное название функции в библиотеке;
Название функции в программе может отличаться от действительного названия функции. Также могут отличаться названия параметров. Главное, чтобы соблюдалась их очередность и тип. Например данную функцию можно объявить так:
Declare Function SetCurDir Lib "kernel32" Alias _"SetCurrentDirectoryA" (ByVal PathName As String) As LongГлобальными API функции можно объявлять только в модулях кода. В коде формы и модулях класса функции можно объявить только локальными:
Private Declare Function SetCurrentDirectory Lib "kernel32" Alias _"SetCurrentDirectoryA" (ByVal lpPathName As String) As LongВозвращаемые значения обычно указываются в аргументах функции. Если функция должна нам возвратить строку, то мы должны предварительно выделить память под нее. Для этого мы должны передать в функцию строку с таким количеством символов (обычно пробелов), чтобы оно было больше или равно количеству возвращаемых символов в строке. Иногда дополнительно в функции есть параметр, в котором нужно указать явно число символов. Например:
Private Declare Function GetWindowsDirectory Lib "kernel32" _Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, _ByVal nSize As Long) As LongPrivate Sub Form_Load()Dim WinDir As StringDim l As IntegerWinDir = Space$(144)" После выполнения функции l будет содержать" число символов в названии директории," WinDir будет содержать название директории+оставшиеся пробелыl = GetWindowsDirectory(WinDir, 144)" Отсекаем лишние пробелыWinDir = Left$(WinDir, l)MsgBox WinDirEnd SubИногда нужно передать в функцию адрес процедуры. Делается это с помощью оператора AddressOf. При этом процедура должна находиться в модуле кода. Например сделаем программу, которая выводит список контролов на Вашей форме. Добавьте на форму список List1, кнопку и несколько любых контролов. Добавьте в код формы следующий код
Private Sub Command1_Click()" Функция EnumChildWindows возвращает список" всех дочерних окон окна, указанного в параметре hwnd" так как контролы тоже являются окнами," то эту функцию можно использовать для" вывода всех контролов на форме" Передаем в функцию описатель формы" и адрес процедуры, которая будет рекурсивно" вызвана столько раз, сколько контролов" найдет функция EnumChildWindowsEnumChildWindows hwnd, AddressOf ChildWindowProc, 0End SubТеперь добавьте в модуль кода
Public Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long _, ByVal lpEnumFunc As Long, ByVal lParam As Long) As LongPublic Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As LongPublic Function ChildWindowProc(ByVal hwnd As Long, ByVal lp As Long) As LongDim Text As StringDim l As LongText = Space$(144)" Получаем название контролаl = GetWindowText(hwnd, Text, 144)" Добавляем в список название контрола и его описательForm1.List1.AddItem Left$(Text, l) + " hwnd=" + Str$(hwnd)" Сообщаем, что вызов функции прошел успешноChildWindowProc = 1End Function