次の方法で共有


RPC NDR 書式指定文字列

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

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

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

概要

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

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

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

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

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

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

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

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