ユーザー マーシャリングには、transmit_asのような書式指定文字列があります。
FC_USER_MARSHAL
flags<1>
quadruple_index<2>
user_type_memory_size<2>
transmitted_type_buffer size<2>
offset_to_the_transmitted_type<2>
1> バイト<フラグは、上のフラグ ニブルと下位アラインメント ニブルで構成されます。
フラグニブルの上位 2 ビットは、ワイヤ型が一意のポインター、参照ポインター、またはポインターなし (ptr にすることはできません) として定義されているかどうかを示すために使用されます。 フラグを設定/取得するために、次のマニフェストが定義されています。
#define USER_MARSHAL_UNIQUE 0x80
#define USER_MARSHAL_REF 0x40
#define USER_MARSHAL_POINTER 0xc0 /* unique or ref */
#define USER_MARSHAL_IID 0x20 /* JIT compiler only */
フラグ ワードのアラインメント ニブルは、送信されたタイプのワイヤ アライメントを維持します。
quadruple_index<2> は、ユーザー マーシャリング関数のコールバック ルーチン 4 倍のインデックスです。 ルーチンの位置は、サイズ変更、マーシャリング、マーシャリング解除、解放ルーチンです。
user_type_memory_size<2> は、不明な型を含むユーザー固有の型のサイズを提供します。
transmitted_type_buffer_size<2> は、サイズが変化する場合は 0 か、実際の固定サイズです。 これは、MIDL がバッファーのサイズを変更するときにコールバックをスキップし、解放するときにもスキップできるようにする最適化です。
範囲
[範囲] チェックでは、NDR レイヤーでの引数検証のための追加の手段が提供されます。 [範囲] 記述子の形式は次のとおりです。
FC_RANGE, flags_type <1>
low value<4>
high value<4>
フラグは上のニブルを取り、型は 2 番目のバイトの下のニブルを受け取ります。 低い値と高い値は、チェックする変数の型によって異なります。
フラグは拡張車両として意味されます。コンパイラはニブルをゼロに設定しています。