Поделиться через


In-Context Меры предосторожности функции перехватчика

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

Меры предосторожности для разработчиков клиентов

Разработчики клиентов должны учитывать следующие проблемы:

  • Функции перехватчика в контексте не должны использовать много времени процессора, так как функция перехватчика должна вернуться перед продолжением серверного приложения.
  • После активации события возможно, что окно, связанное с событием, больше не существует по времени вызова функции перехватчика. Клиенты должны убедиться, что окно, связанное с событием, по-прежнему существует, прежде чем принимать любые другие действия, связанные с событием. Чтобы убедиться, что окно по-прежнему существует, клиенты используют функцию Microsoft Win32 IsWindow.
  • Если библиотека DLL, в которой функция перехватчика определена, ссылки на другую библиотеку DLL, разработчики клиентов должны убедиться, что система загружает другую библиотеку DLL. При неявном связывании (с помощью файлов и импорта )дополнительная библиотека DLL должна находиться в каталоге Windows или в одном из системных каталогов, таких как Windows\System, Windows\System32 или Windows\SysWOW64. При явном связывании (с помощью LoadLibrary), полный путь к каталогу, в котором находится дополнительная библиотека DLL, необходимо указать в вызове LoadLibrary.
  • Функции перехватчика в контексте могут привести к переполнению стека при загрузке библиотеки DLL, содержащей функцию перехватчика, в 16-разрядное приложение. Эта проблема возникает из-за того, что 16-разрядные приложения используют фиксированный размер стека, который недостаточно велик для размещения цепочки вызовов системных функций, которые приводят к вызову функции перехватчика.

Меры предосторожности для разработчиков серверов

Разработчикам сервера необходимо учитывать, что клиентские приложения могут регистрировать функции перехватчика в контексте. Когда сервер вызывает NotifyWinEvent, он должен быть готов к обработке WM_GETOBJECT и других методов IAccessible.

Недопустимые указатели интерфейса

Когда клиент вызывает AccessibleObjectFromEvent в функции перехватчика в контексте, указатель интерфейса IAccessible, который возвращается непосредственно к коду в адресном пространстве сервера. Если клиент вызывает свойство интерфейса с помощью этого указателя, библиотека объектной модели компонента (COM) не связана с маршалингом (упаковка и отправка параметров интерфейса через границы процесса) или распаковкой (распаковка параметров, отправленных через границы процесса) и не обнаруживает, уничтожен ли объект.

Если клиент вызывает свойство интерфейса к уничтоженному объекту, недопустимый указатель интерфейса вызывает ошибку General Protection в адресном пространстве сервера, если сервер не обнаруживает эту ситуацию.

Чтобы защититься от недопустимых указателей интерфейса, серверы создавать прокси-объекты, которые упаковывают доступные объекты и отслеживают срок жизни доступных объектов. Например, когда клиент вызывает свойство I Available для получения сведений об объекте, прокси-сервер проверяет, доступен ли доступный объект, а если да, пересылает запрос клиента в доступный объект. Если объект со специальным доступом уничтожен, прокси-сервер возвращает клиенту ошибку.