DCOM 核心概念
DCOM (Distributed COM) 將 COM 的進程透明性擴展為位置透明性:元件與客戶端可位於不同電腦(區域網、廣域網、Internet),通訊細節由 DCOM 處理,程式碼無需修改。
從 COM 到 DCOM
- 本地進程外元件:LPC (Local Procedure Call) 跨進程通訊。
- DCOM:將 LPC 替換為RPC (Remote Procedure Call) 網路傳輸,路徑變長、環境更脆弱,需更完善的錯誤處理與可靠性機制。
遠端物件定位與建立
- 客戶端呼叫
CoCreateInstanceEx 等建立函數,提供 COSERVERINFO 結構指定遠端機器名。
- 或透過 DCOM 設定工具 (dcomcnfg.exe) 在註冊表
HKCR\AppID 設定 RemoteServerName(位置透明)。
- 本地 SCM (Service Control Manager,
Rpcss.exe) 透過 RPC 呼叫遠端 SCM。
- 遠端 SCM 啟動元件進程、建立物件、回傳介面指標。
- 經封送處理建立代理器/存根,後續通訊直接在代理器/存根間進行,不再經 SCM。
封送處理與 ORPC
- 封送處理:參數打包為資料封包(標準/自訂封送),跨進程/機器傳輸。
- DCOM 採用 NDR (Network Data Representation) 標準資料表示法(DCE RPC 規範),確保異構平台相容。
- ORPC (Object RPC):DCOM 協議別名,建立面向物件的遠端呼叫規範,封包附加 IPID (Interface Pointer Identifier)、版本、擴展資訊。
- 客戶端需定期 pinging 遠端物件維持連線(預設 2 分鐘間隔,3 次失敗判定超時)。
DCOM 關鍵特性
| 特性 | 說明 |
| 位置透明性 | 客戶端程式碼無感知遠端位置 |
| 可伸縮性 | 利用 OS 伸縮性;元件可部署於不同伺服器,無需修改程式碼 |
| 可設定性 | dcomcnfg.exe 圖形化設定安全性、身分、位置,無需重編譯 |
| 安全性 | 存取安全性(誰可呼叫)、啟動安全性(誰可建立),基於 Windows NT 可擴展安全架構 |
| 協定無關性 | 支援 TCP/IP、SPX/IPX、HTTP 等多種傳輸協定 |
| 平台獨立性 | ORPC/NDR 為跨平台標準 |
物件啟動模式
- 註冊表指定遠端伺服器:
AppID 關聯多個 CLSID,共享進程與設定。
- 程式碼指定伺服器:
CoCreateInstanceEx 等 API 傳入 COSERVERINFO,支援動態負載平衡(分派服務物件選擇最輕載伺服器)。
代理進程:讓 DLL 也能遠端執行
- 進程內元件 (DLL) 無法直接在遠端機器執行,需代理進程 載入 DLL。
- Windows 提供預設代理進程(混合執行緒模型、偽 COM 服務)。
- 條件:註冊表
CLSID\AppID 設定 DllSurrogate、CLSCTX_LOCAL_SERVER 旗標、無 LocalServer32、有 InprocServer32。
- 優點:DLL 崩潰不影響客戶端;單一代理進程服務多客戶端;享有代理進程安全性。
單體物件連接遠端實例
- COM 命名與綁定機制(Moniker)同樣適用遠端物件。
- 連接管理:優化遠端
AddRef/Release(OXID 物件匯出器識別碼)、pinging 機制偵測客戶端異常終止、連接點機制支援雙向通訊、連接傳遞實現負載平衡分派。
併發管理:執行緒模型與訊息過濾器
- 套間執行緒 (STA):對應 UI 執行緒,有訊息迴圈,COM 自動同步(單執行緒進入),物件無需自行同步。
- 自由執行緒 (MTA):對應 Worker 執行緒,多執行緒並發呼叫,物件必須自行同步(執行緒安全)。
- 訊息過濾器:處理同步/非同步/輸入同步呼叫時的重入與阻塞問題。
安全模型
- 建立於底層安全提供者(Windows NT 鑑別服務)。
- RPC 鑑別 5 層級:無 → 連線時 → 每呼叫 → 每封包完整性 → 加密。
- 兩類安全性:啟動安全性(誰可建立物件)、呼叫安全性(誰可呼叫方法),支援模擬等級與授權。
總結
DCOM 以 ORPC/NDR 為基礎,提供位置透明、可設定、安全、可伸縮的分散式元件架構。核心機制包括:遠端啟動 (SCM)、封送處理 (NDR)、代理進程 (DLL 遠端化)、連接管理 (OXID/pinging)、併發模型 (STA/MTA) 與分層安全模型。