DLL 為進程內伺服器,EXE 為進程外(本地/遠端)伺服器。跨進程邊界呼叫涉及位址空間隔離、參數封送、LPC 機制與 Proxy/Stub 架構。本文系統梳理理論基礎,為後續實作鋪路。
進程邊界挑戰
- 每個 EXE 擁有獨立虛擬位址空間,邏輯位址對應不同物理位址,不可直接共用指標。
- 需解決三大問題:跨進程函式呼叫、參數資料傳遞、客戶端無感知(統一介面)。
本地程序呼叫
- LPC = Local Procedure Call,Windows 核心實作的同機進程間通訊機制,基於 RPC 簡化而來。
- 核心知曉各進程位址空間映射,可代為呼叫目標進程函式。
封送
- 將參數從呼叫端位址空間複製/轉換到被呼叫端空間的過程。
- 同機器:直接記憶體複製。異機器:需轉換為標準格式(NDR,Network Data Representation)處理位元序差異。
- 元件可實作
IMarshal 自訂封送邏輯;COM 提供標準實作滿足多數需求。
Proxy/Stub 架構(客戶端透明性關鍵)
- Proxy(代理):客戶端進程內的 DLL,模擬元件介面,負責參數封送 + LPC 呼叫。
- Stub(存根):伺服器端進程內的 DLL,負責反封送參數、呼叫真實元件、將結果封送回傳。
- 客戶端呼叫 Proxy 如同呼叫本地介面,完全感知不到跨進程細節。
類比:Win32 API 呼叫 → 系統 DLL → LPC → 核心模式實作。COM 採用相同分層思想。
開發者無需手寫 Proxy/Stub
- MIDL 編譯器依據 IDL 自動產生 Proxy/Stub 程式碼。
- 註冊時將 Proxy/Stub DLL 登錄至系統(
HKCR\Interface\{IID}\ProxyStubClsid32)。
- 標準封送器支援所有 Automation 相容類型(BSTR、VARIANT、SAFEARRAY 等)。
總結
理解 LPC、封送、Proxy/Stub 三大支柱,是掌握 COM 進程外開發的理論基石。實際專案中,MIDL 自動化處理絕大多數細節,開發者專注於 IDL 設計、執行緒模型選擇與介面語意正確性即可。