Идёт загрузка страницы...

htp://aptem.net.ru






На главную страничку учебника Visual Basic

Процедуры обратного вызова

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

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

Обратные вызовы в Visual Basic

Visual Basic позволяет создавать процедуры обратного вызова, которые обеспечивают сообщение клиенту.

Например, можно создать процедуру обратного вызова, которая будет посылать сообщение клиенту каждый раз, когда сервер выполнит некоторую операцию. Затем для вызова этой процедуры используется DLL.

На следующей иллюстрации показано, как процедуры обратного вызова работают в Visual Basic:

Передача процедуры обратного вызова к DLL

Для передачи процедуры обратного вызова к DLL Visual Basic использует операцию AddressOf. Процедура обратного вызова должна быть размещена в стандартном модуле и иметь правильный синтаксис.

Нахождение точного синтаксиса для процедуры обратного вызова может быть довольно трудной задачей, так как обычно указания на этот счет можно найти только в документации к DLL. Использование правильного синтаксиса важно, так как Visual Basic не обеспечивает контроль синтаксиса и ничего не сообщает относительно ошибок.

Примечание: Использование неправильного синтаксиса в процедуре обратного вызова наиболее вероятно обусловит в приложении фатальную ошибку в период выполнения.

При специфицировании обратных вызовов из Visual Basic следует убедиться в том, что выполнены следующие два требования:

  • функция обратного вызова должна быть размещена в стандартном модуле;
  • для передачи процедуры обратного вызова к DLL должна использоваться операция AddressOf.

Пример обратного вызова

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

Declare Function EnumWindows Lib "user32" _
(ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, _
ByVal cch As Long) As Long

Здесь первая функция используется для перечисления всех окон. В неё передаётся адрес функции-обработки. Вторая для получения заголовка окна по его дескриптору.

Поместите на форму кнопку Command и список ListBox. Теперь опишем функцию обработки EnumWindowsProc и вставим её в стандартный модуль (это обязательно).

Public Function EnumWindowsProc (ByVal hwnd As Long, _
ByVal lParam As Long) As Boolean

Dim capt As String
Dim lenC As Long
capt = String(255, " ") 'заполняем строку пробелами
lenC = GetWindowText(hwnd, capt, 255) 'получаем заголовок окна hwnd
capt = Left(capt, lenC) 'обрезаем его, оставляя только нужную часть
If capt <> "" Then Form1.List1.AddItem Str(hwnd) & " " & capt
EnumWindowsProc = True

End Function

В параметр hwnd передаётся дескриптор найденного окна. В конце обработки мы присваиваем нашей EnumWindowsProc значение True. Если этого не сделать, то функция EnumWindows больше не будет вызывать EnumWindowsProc.

Ну и наконец вставим код вызова EnumWindows в обработку клика кнопки:

Private Sub Command1_Click()
EnumWindows AddressOf EnumWindowsProc, 0
End Sub

Запустите программу и посмотрите на результат. Вы должны получить дескрипторы всех существующих в данный момент окон, содержащих заголовок.

На главную страничку учебника Visual Basic