На главную страничку учебника Visual BasicПроцедуры обратного вызова DLL может сообщать или давать информацию клиенту, вызывая подпрограмму, обеспечиваемую клиентом. Эта подпрограмма клиента известна как функция обратного вызова. В течение одного вызова Windows API эта функция обратного вызова может вызываться несколько раз. Процедуры-перечисления, в которых перечисляется набор элементов, являются общим примером DLL, использующих функции обратного вызова для передачи информации клиенту. Обратные вызовы в Visual BasicVisual Basic позволяет создавать процедуры обратного вызова, которые обеспечивают сообщение клиенту. Например, можно создать процедуру обратного вызова, которая будет посылать сообщение клиенту каждый раз, когда сервер выполнит некоторую операцию. Затем для вызова этой процедуры используется DLL. На следующей иллюстрации показано, как процедуры обратного вызова работают в Visual Basic: Передача процедуры обратного вызова к DLL Для передачи процедуры обратного вызова к DLL Visual Basic использует операцию AddressOf. Процедура обратного вызова должна быть размещена в стандартном модуле и иметь правильный синтаксис. Нахождение точного синтаксиса для процедуры обратного вызова может быть довольно трудной задачей, так как обычно указания на этот счет можно найти только в документации к DLL. Использование правильного синтаксиса важно, так как Visual Basic не обеспечивает контроль синтаксиса и ничего не сообщает относительно ошибок. Примечание: Использование неправильного синтаксиса в процедуре обратного вызова наиболее вероятно обусловит в приложении фатальную ошибку в период выполнения. При специфицировании обратных вызовов из Visual Basic следует убедиться в том, что выполнены следующие два требования:
Пример обратного вызова А теперь давайте рассмотрим пример использования процедур обратного вызова для получения списка дескрипторов и заголовков всех существующих в данный момент окон. Итак, объявляем нужные API функции: Declare
Function
EnumWindows Lib "user32" _ Здесь первая функция используется для перечисления всех окон. В неё передаётся адрес функции-обработки. Вторая для получения заголовка окна по его дескриптору. Поместите на форму кнопку Command и список ListBox. Теперь опишем функцию обработки EnumWindowsProc и вставим её в стандартный модуль (это обязательно). Public Function
EnumWindowsProc (ByVal hwnd As
Long, _ Dim
capt As String End Function В параметр hwnd передаётся дескриптор найденного окна. В конце обработки мы присваиваем нашей EnumWindowsProc значение True. Если этого не сделать, то функция EnumWindows больше не будет вызывать EnumWindowsProc. Ну и наконец вставим код вызова EnumWindows в обработку клика кнопки: Private
Sub
Command1_Click() Запустите программу и посмотрите на результат. Вы должны получить дескрипторы всех существующих в данный момент окон, содержащих заголовок. На главную страничку учебника Visual Basic |