Основы офисного программирования и язык VBA


Обработка ошибок, возникающих при вызове функций Win32 API - часть 2


Давайте вернемся к этому примеру и попробуем обработать эту ошибку. В раздел объявлений ранее созданного модуля Unicode мы добавили объявление констант и функций и теперь он выглядит так:

Option Explicit

Public Const ERROR_INVALID_NAME = 123&

'Объявление вызываемых функций Public Declare Function FindWindowA Lib "user32" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 'Функции в Unicode кодировке 'Тип string заменен на Any. Передача аргумента по ссылке Public Declare Function FindWindowW Lib "user32" _ (lpClassName As Any, lpWindowName As Any) As Long

Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextW" _ (ByVal hwnd As Long, lpString As Any, ByVal cch As Long) As Long

Public Declare Function SetWindowText Lib "user32" Alias "SetWindowTextW" _ (ByVal hwnd As Long, lpString As Any) As Long

Public Declare Function GetActiveWindow Lib "user32" () As Long

Public ArCapt() As Byte 'Объявление динамического массива

Приведем теперь процедуру, в которой вызывается функция FindWindowW, приводящая к ошибке периода выполнения:

Пример 6.6.

(html, txt)

Приведем результаты печати , появившиеся в окне отладки при выполнении этой процедуры:

DocOne6 - Microsoft Word Не корректно задано имя при вызове Unicode FindWindowW функции! Microsoft Visual Basic - DocOne6 [running] - [Unicode (Code)] Не корректно задано имя при вызове Unicode FindWindowW функции!

Прокомментируем теперь работу программы и полученные результаты:

  • Вначале мы попытались найти окно с заведомо существующим заголовком, - окно документа, содержащего тестовые примеры. В процессе работы функции Win32 API FindWindowW возникла ошибка периода выполнения, функция вернула нулевой результат. Ошибка была обработана, и как показывает константа ERROR_INVALID_NAME, причиной является ошибка в задании имени (передаваемый формат в виде массива байтов не годится для цели поиска и сравнения строк), о чем свидетельствует отладочная информация.
  • Далее проводится еще один эксперимент на ту же тему.Для активного окна находится заголовок, используя функцию GetWindowTextW, возвращающую строку в виде массива байтов. Тут же этот массив используется для поиска окна по заголовку. Однако ничего не помогает и снова при поиске окна возникает ошибка. Она обрабатывается, о чем выдается соответствующее сообщение.




Начало  Назад  Вперед