封送處理詳細數據

如果您使用標準封送處理,COM 會為您處理這裡所述的所有詳細數據。 不過,有少數程式設計人員需要這些詳細數據,以及那些對基礎資訊感興趣的程式設計人員。 封送處理是封裝和解壓縮參數的程式,因此可以進行遠端過程調用。

不同的參數類型會以不同的方式封送處理。 例如,封送處理整數參數牽涉到將值複製到訊息緩衝區。 (即使在這個簡單的案例中,也有位元節排序在跨電腦呼叫中處理的問題。不過,封送處理陣列是更複雜的程式。 陣列成員會依特定順序複製,讓另一端可以完全重新建構陣列。 封送處理指標時,指標所指向的數據會遵循處理結構中巢狀指標的規則和慣例來複製。 唯一的函式可用來處理每個參數類型的封送處理。

使用標準封送處理時,Proxy 和存根是介面的系統範圍資源,而且它們會透過標準通訊協定與通道互動。 標準封送處理可以同時由標準 COM 定義的介面和自定義介面使用,如下所示:

  • 在大部分的 COM 介面中,標準封送處理的 Proxy 和存根都是從 COM 在 Ole32.dll 中提供的全系統 DLL 載入的進程元件物件。
  • 在自定義介面的情況下,標準封送處理的 Proxy 和存根是由介面設計工具所產生,通常是使用 MIDL。 這些 Proxy 和存根會以靜態方式在登錄中設定,因此任何潛在的用戶端都可以跨進程界限使用自定義介面。 這些 Proxy 和存根會從透過系統登錄找到的 DLL 載入,並使用它們封送處理之自定義介面的介面識別碼 (IID)。
  • 使用 MIDL 來產生自定義介面的 Proxy 和存根的替代方法,可以改為產生類型連結庫,而且系統提供的型別連結庫驅動封送處理引擎將會封送處理介面。

除了標準封送處理,介面(標準或自定義)可以使用自定義封送處理。 使用自定義封送處理時,物件會在運行時間動態實作它所支援之每個介面的 Proxy。 針對任何指定的介面,物件可以選取 COM 提供的標準封送處理或自定義封送處理。 這個選擇是由物件以介面為基礎進行。 一旦為指定的介面做出選擇,它就會在物件的存留期期間維持有效狀態。 不過,物件上的一個介面可以使用自定義封送處理,而另一個介面則使用標準封送處理。

自定義封送處理在實作自定義封送處理的物件本身就是唯一的。 它會使用 物件所實作的 Proxy,並在運行時間依要求提供給系統。 實作自定義封送處理的對象必須實 作 IMarshal 介面,而支援標準封送處理的物件則不會。

如果您決定撰寫自定義介面,則必須提供封送處理支援。 一般而言,您會為您所設計的介面提供標準封送處理 DLL。 您可以建立 Proxy/stub 程式代碼和 Proxy/存根 DLL,也可以建立 COM 將用來執行數據驅動封送處理的類型庫(使用類型連結庫中的數據)。

若要讓用戶端在另一個進程中呼叫 物件中的介面方法,牽涉到數個元件的合作。 標準 Proxy 是位於用戶端進程空間中的介面特定程式代碼片段,並準備介面參數以進行傳輸。 它會封裝或封送處理,讓它們可以在接收程式中重新建立和瞭解。 標準存根也是介面特定程式代碼的一部分,位於伺服器的進程空間中,並反轉 Proxy 的工作。 存根解除封裝或取消包裝、傳送的參數,並將其轉送至物件應用程式。 它也會封裝回復資訊以傳送回用戶端。

注意

比 COM 更熟悉 RPC 的讀者,可用來查看用戶端存根和伺服器存根詞彙。 這些詞彙類似於 Proxy 和存根。

 

進程間通訊的元件

下圖顯示相關元件之間的通訊流程。 在進程界限的用戶端上,用戶端的 方法呼叫會經過 Proxy,然後進入屬於 COM 連結庫的通道。 通道會將包含封送處理參數的緩衝區傳送至 RPC 運行時間連結庫,以跨進程界限傳輸它。 RPC 運行時間和 COM 鏈接庫存在於進程的兩端。 通道與 RPC 執行時間之間的差異是這個實作的特性,不屬於程式設計模型或 COM 用戶端/伺服器物件的概念模型。 COM 伺服器只會看到 Proxy 或存根,並間接看到通道。 未來的實作可能會使用通道下方的不同層或沒有圖層。

Diagram that shows the Client.exe and Server.exe flows on each side fo the Process Boundary.

通道

對象間通訊

Microsoft RPC

Proxy

Stub