RPC NDR 格式字串
NDR 引擎:32 位解譯器
本檔描述 32 位 NDR 引擎有時稱為 MOP 的格式字串描述元。 本節說明從 –Oi 解譯器演進到 –Oif 解譯器層的相關變更,以及與管道和非同步支援相關的新增專案。
本檔說明目前的 Microsoft 介面定義語言 (MIDL) 技術,以及目前的 NDR 引擎。
概觀
NDR 引擎是遠端程序呼叫的封送處理引擎, (RPC) 和 DCOM 元件。 它會處理遠端呼叫的所有存根相關問題。 作為程式,NDR 封送處理是由 C 程式碼從 MIDL 產生的存根、MIDL JIT 類型產生器,或由其他工具或手動撰寫的存根所驅動。 接著,NDR 引擎會驅動與特定傳輸通訊的基礎執行時間 (DCOM 或 RPC) 。
設計的原始目標是根據 MIDL 編譯器提供的資訊,為任意資料提供有效封送處理的工具。 本檔中所述的格式字串,確實是編譯器針對 NDR 引擎取用所產生的所有資訊,一律會被視為編譯器和引擎之間的內部介面。 同樣地,引擎可用來處理執行時間問題的介面,大部分都是內部 (某些例外狀況存在於 RPC 執行時間端,而引擎所使用的某些 DCOM 介面則為外部) 。
封送處理兩個典型的方法一律是內嵌方式,且資料驅動 (解譯) 技術。 MIDL 支援透過其 C 產生的存根中的 –Os 和 –Oi* 參數。 此外,MIDL 可以產生 oleautomation 套件所使用的 TLB 程式庫。 因此,引擎內部的其中一個檢視方塊是由兩個部分所組成。
第一個是一組處理調整大小、封送處理等的常式,對應至結構或陣列等一般資料類型物件。 這些常式會微調效能;例如,它們通常會盡可能嘗試封鎖複製資料。 此部分通常稱為核心 NDR 引擎。
第二個部分是由解譯器及其相關部分所組成。 解譯器會使用核心 NDR 引擎的常式,就像來自內部程式庫一樣,以適當方式執行所有引數封送處理和取消封送處理的遠端呼叫。
核心 NDR 引擎會以類似的方式使用,無論是從內嵌存根或解譯器使用。 所有核心引擎常式都取決於存根訊息結構傳入的狀態。 結構是由內嵌存根或解譯器適當地設定。 多年來,核心引擎已在不同的內容中使用;目前解譯器實際上是數個相異解譯器迴圈的集合。 這些與舊 (–Oi 與 –Oif) 解譯器相關,以及與資料序列化 (挑選) 相關的迴圈、RPC 非同步支援和 DCOM 非同步支援 (RPC 和 DCOM 有不同的非同步程式設計模型) 。
除了新增新功能之外,NDR 引擎演進的重要層面是解譯器方法的一般轉變。 NDR 1.1 版開始作為封送處理的新 MIDL 2.0 方法的一部分,而內嵌存根則優先用於效能考慮。 使用最新版的 NDR 時, –Oif 已成為編譯器最廣泛使用的模式,幾乎是排除內嵌存根。
RPC NDR 引擎格式字串描述元會在下列主題中詳細說明: