ユーザーマーシャリング

ユーザー マーシャリングには、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 レイヤーでの引数検証のための追加の手段が提供されます。 [range] 記述子の形式は次のとおりです。

FC_RANGE,   flags_type <1>
low value<4>
high value<4>

フラグは上のニブルを受け取り、型は 2 番目のバイトの下位ニブルを受け取ります。 低い値と高い値は、チェックする変数の型によって異なります。

旗は拡張車両として意図されています。コンパイラは nibble を 0 に設定しています。