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


32-разрядная и 64-разрядная совместимость

Вспомогательные технологические приложения должны взаимодействовать между границами процесса для получения сведений о пользовательском интерфейсе с серверов Microsoft Active Специальные возможности и поставщиков службы автоматизации пользовательского интерфейса Майкрософт. В этом разделе описываются основные проблемы взаимодействия между процессами, которые необходимо учитывать при разработке приложений специальных возможностей Windows.

Когда приложения используют API службы автоматизации Windows, компоненты microsoft Active Специальные возможности и средства автоматизации пользовательского интерфейса автоматически обрабатывают все проблемы и сложности, связанные с выполнением межпроцессных коммуникаций (IPC), включая проблемы взаимодействия, связанные с одним процессом 32-разрядных, а другой — 64-разрядными. Корпорация Майкрософт признает, что существуют случаи, когда приложению вспомогательных технологий может потребоваться использовать некоторую форму IPC вместо API автоматизации Windows для взаимодействия с сервером Microsoft Active Accessibility или поставщиком службы автоматизации пользовательского интерфейса. В этих случаях корпорация Майкрософт рекомендует использовать сообщения DCOM или Windows (те, которые меньше значений WM_USER) для взаимодействия с другими процессами. Как и API службы автоматизации Windows, DCOM и сообщения Windows автоматически обрабатывают все проблемы IPC, включая 32-разрядную 64-разрядную совместимость.

Если api автоматизации Windows, DCOM и сообщения Windows не являются вариантом, при реализации выбранного метода IPC следует учитывать следующие проблемы:

  • Общая память. При использовании общей памяти следует учитывать, что структура в 32-разрядном процессе может иметь другой размер и макет, чем та же структура в 64-разрядном процессе. Это особенно верно для структур, содержащих указатели или дескрипторы.
  • Усечение указателя. Хотя 32-разрядное приложение может использовать тип данных longlong LONGLONG для хранения 64-разрядного значения, существуют экземпляры, в которых отсутствует элемент API Windows, позволяющий 32-разрядному приложению получать 64-разрядное значение из 64-разрядного процесса или отправлять 64-разрядное значение в 64-разрядный процесс. Например, GetWindowLongPtr и SendMessage функции усечь все значения указателя, оставляя 32-разрядное приложение бесполезным значением.
  • Обработка. Так как дескрипторы ядра32 и user32 являются только 32-разрядными в 32-разрядных и 64-разрядных процессах, их можно передавать между процессами без проблем. Однако некоторые элементы, которые Windows определяет как дескрипторы, действительно просто упакованы указатели (например, HTREEITEM). Эти дескрипторы будут усечены, если они передаются из 64-разрядного процесса в 32-разрядный процесс.
  • WinEvent Функции перехватчика— чтобы зарегистрировать функцию перехватчика в контексте с помощью 32-разрядного процесса сервера, функция перехватчика должна находиться в 32-разрядной библиотеке DLL. Аналогичным образом, чтобы зарегистрировать функцию перехватчика в контексте с 64-разрядным процессом сервера, функция перехватчика должна находиться в 64-разрядной библиотеке DLL. Если приложение вспомогательной технологии пытается зарегистрировать функцию перехватчика в контексте с сервером с другой битовой глубиной, события по-прежнему будут доставлены в функцию перехватчика, но они будут доставлены вне контекста. Дополнительные сведения см. в разделе WinEvents и In-Context и функции перехватчика вне контекста.

Дополнительные сведения о 32-разрядной и 64-разрядной взаимодействиях см. в взаимодействия процессов.

Обзор API автоматизации Windows