共用方式為


32 位和 64 位互通性

輔助技術應用程式需要跨進程界限進行通訊,才能從 Microsoft Active Accessibility 伺服器和 Microsoft 消費者介面自動化提供者取得 UI 資訊。 本主題描述開發 Windows 協助工具應用程式時,您需要記住的主要處理序間通訊問題。

當應用程式使用 Windows 自動化 API 時,Microsoft Active Accessibility 和 消費者介面自動化執行時間元件會自動處理執行處理序間通訊 (IPC) 所涉及的所有問題和複雜度,包括其中一個進程為 32 位且另一個是 64 位時所涉及的互通性問題。 Microsoft 發現有時候,輔助技術應用程式可能需要使用某種形式的 IPC,而不是 Windows 自動化 API 來與 Microsoft Active Accessibility Server 或 消費者介面自動化 提供者通訊。 在這些情況下,Microsoft 建議您使用 DCOM 或 Windows 訊息, (值小於 WM_USER) 的值來與其他進程通訊。 如同 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 和 user32 控制碼在 32 位和 64 位進程中只有 32 位顯著性,所以可以在進程之間傳輸,而不會發生問題。 不過,Windows 定義為控制碼的某些專案實際上只是 (包裝的指標,例如 HTREEITEM) 。 如果從 64 位進程傳遞至 32 位進程,則會截斷這些「控制碼」。
  • WinEvent Hook Functions— 若要向 32 位伺服器進程註冊內容內攔截函式,攔截函式必須位於 32 位 DLL 中。 同樣地,若要向 64 位伺服器進程註冊內容內攔截函式,攔截函式必須位於 64 位 DLL 中。 如果輔助技術應用程式嘗試向具有不同位深度的伺服器註冊內容內勾點函式,事件仍會傳遞至攔截函式,但它們將會在內容外傳遞。 如需詳細資訊,請參閱 WinEvents 和 內容內和內容外攔截函式

如需 32 位和 64 位互通性的詳細資訊,請參閱 進程互通性

Windows 自動化 API 概觀