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


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

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

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

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

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

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

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

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

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

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

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