RPC NDR 書式指定文字列

NDR エンジン: 32 ビット インタープリター

このドキュメントでは、32 ビット NDR エンジンの書式指定文字列記述子 (MOP とも呼ばれます) について説明します。 このセクションでは、 –Oi インタープリターから –Oif インタープリター レイヤーへの進化に関連する変更と、パイプと非同期サポートに関連する追加について説明します。

このドキュメントでは、エンジンの観点から見た現在の Microsoft インターフェイス定義言語 (MIDL) テクノロジと、現在の NDR エンジンについて説明します。

概要

NDR エンジンは、リモート プロシージャ コール (RPC) および DCOM コンポーネントのマーシャリング エンジンです。 リモート呼び出しのすべてのスタブ関連の問題を処理します。 プロセスとして、NDR マーシャリングは、MIDL で生成されたスタブからの C コード、MIDL JIT 型ジェネレーター、または他のツールによって生成されたスタブ、または手動で記述されたスタブによって駆動されます。 さらに、NDR エンジンは、特定のトランスポートと通信する基になるランタイム (DCOM または RPC) を駆動します。

設計の当初の目標は、MIDL コンパイラによって提供される情報に基づいて、任意のデータを効果的にマーシャリングするためのツールを提供することでした。 このドキュメントで説明する書式指定文字列と、実際に NDR エンジンを使用するためにコンパイラによって生成されるすべての情報は、常にコンパイラとエンジンの間の内部インターフェイスと見なされています。 同様に、ランタイムの問題を処理するためにエンジンで使用できるインターフェイスもほとんど内部です (一部の例外は RPC ランタイム側に存在し、エンジンで使用される一部の DCOM インターフェイスは外部です)。

マーシャリングに対する 2 つの一般的なアプローチは、常にインラインでデータドリブン (解釈) テクノロジでした。 MIDL では、C で生成されたスタブ内の –Os スイッチと –Oi* スイッチの両方を使用してサポートされます。 さらに、MIDL では、oleautomation パッケージで使用される TLB ライブラリを生成できます。 したがって、エンジンの内部の 1 つの視点は、2 つの部分で構成されているということです。

1 つ目は、構造体や配列などの一般的なデータ型オブジェクトに対応する、サイズ変更、マーシャリングなどを処理するルーチンのセットです。 これらのルーチンは、パフォーマンスに合わせて微調整されます。たとえば、通常、可能な限りデータのブロック コピーを試みます。 この部分は、多くの場合、コア NDR エンジンと呼ばれます。

2 番目の部分は、インタープリターとその関連する部分で構成されます。 インタープリターは、必要に応じて、すべての引数をマーシャリングおよびマーシャリング解除してリモート呼び出しを実行するために、内部ライブラリの場合と同様に、コア NDR エンジンのルーチンを使用します。

コア NDR エンジンは、インライン スタブから、またはインタープリターから使用されるかどうかにかかわらず、同様の方法で使用されます。 すべてのコア エンジン ルーチンは、スタブ メッセージ構造によって渡される状態に依存します。 構造体は、インライン スタブまたはインタープリターによって適切に設定されます。 長年にわたり、コアエンジンは別のコンテキストで使用されていました。現在、インタープリターは実際にはいくつかの個別のインタープリター ループのセットです。 これらは、古いインタープリターと新しい (–Oi–Oif) インタープリター、およびデータ シリアル化 (ピクルス)、RPC 非同期サポート、DCOM 非同期サポート (RPC と DCOM の非同期プログラミング モデルが異なる) に関連するループに関連しています。

NDR エンジンの進化の重要な側面は、新機能の追加に加えて、インタープリターへのアプローチの一般的なシフトです。 NDR バージョン 1.1 は、マーシャリングに対する新しい MIDL 2.0 アプローチの一部として開始されました。パフォーマンスに関する考慮事項にはインライン スタブが推奨されています。 NDR の最新バージョンでは、 -Oif はコンパイラの最も広く使用されているモードになり、ほぼインライン スタブの除外にまでなっています。

RPC NDR エンジン形式の文字列記述子については、次のトピックで詳しく説明します。