32位和64位互操作性

辅助技术应用程序需要跨进程边界进行通信,以便从 Microsoft Active Accessibility 服务器和 Microsoft UI 自动化提供程序获取 UI 信息。 本主题介绍在开发 Windows 辅助功能应用程序时需要记住的主要进程间通信问题。

当应用程序使用 Windows 自动化 API 时,Microsoft Active Accessibility 和 UI 自动化运行时组件会自动处理执行进程间通信时所涉及的所有问题和复杂性, (IPC) ,其中一个进程为32位,另一个进程为64位时涉及互操作性问题。 microsoft 认识到,在某些情况下,辅助技术应用程序可能需要使用某种形式的 IPC 而不是 Windows 自动化 API 来与 Microsoft Active Accessibility 服务器或 UI 自动化提供程序进行通信。 在这种情况下,Microsoft 建议你使用 DCOM 或 Windows 消息 (其值小于 WM _ 用户) 的值才能与其他进程通信。 与 Windows 自动化 API 一样,DCOM 和 Windows 消息会自动处理所有 IPC 问题,包括32位到64位的互操作性。

当不能选择 Windows 自动化 API、DCOM 和 Windows 消息时,请在实施所选 IPC 方法时记住以下问题:

  • 共享内存-使用共享内存时,请注意,32位进程中的结构的大小和布局可能不同于64位进程中的相同结构。 对于包含指针或句柄的结构,尤其如此。
  • 指针截断-尽管32位应用程序可以使用 LONGLONG 数据类型来存储64位值,但是存在一些实例,其中不存在任何 Windows API 元素,这会使32位应用程序从64位进程接收64位值,或者将一个64位值发送到一个64。 例如, GetWindowLongPtrSendMessage 函数截断所有指针值,使32位应用程序的值保持不变。
  • 处理-由于 kernel32.dll 和 user32 句柄仅在32位和64位进程中的32位都有意义,因此可以在无问题的进程之间传输。 但 Windows 定义为句柄的某些项实际上只是包装的指针 (例如 HTREEITEM) 。 如果将这些 "句柄" 从64位进程传递到32位进程,它们将被截断。
  • Get-winevent 挂钩函数-若要使用32位服务器进程注册上下文内挂钩函数,挂钩函数必须位于32位 DLL 中。 同样,若要使用64位服务器进程注册上下文内挂钩函数,挂钩函数必须位于64位 DLL 中。 如果辅助技术应用程序尝试使用具有不同的位深度的服务器注册上下文中挂钩函数,则事件仍会传递到挂钩函数,但会传递到上下文外。 有关详细信息,请参阅了 winevent 和 上下文外挂钩函数

有关32位和64位互操作性的详细信息,请参阅 进程互操作性

Windows自动化 API 概述