パラメーター記述子
前述のように、–Oiと –Oif スタイルのパラメーター記述子存在します。
–Oi パラメーター記述子
完全に解釈されたスタブには、RPC 呼び出しの各パラメーターに関する追加情報が必要です。 プロシージャのパラメーターの説明は、プロシージャの説明の直後に続きます。
パラメーター記述子 の
[の] または単純型パラメーターの戻り値の説明の形式は次のとおりです。
FC_IN_PARAM_BASETYPE
simple_type<1>
–又は–
FC_RETURN_PARAM_BASETYPE
simple_type<1>
ここで、simple_type<1> は、単純型を示す FC トークンです。 コードは次のとおりです。
4e FC_IN_PARAM_BASETYPE
53 FC_RETURN_PARAM_BASETYPE
その他 –大井
パラメーター記述子 の
他のすべてのパラメーター型の説明の形式は次のとおりです。
param_direction<1>
stack_size<1>
type_offset<2>
これらの各説明の param_direction<1> フィールドは、次の表に示すフィールドのいずれかである必要があります。
16 進 | 旗 | 意味 |
---|---|---|
4d | FC_IN_PARAM | in パラメーター。 |
50 | FC_IN_OUT_PARAM | 入力/出力パラメーター。 |
51 | FC_OUT_PARAM | out パラメーター。 |
52 | FC_RETURN_PARAM | プロシージャの戻り値。 |
4f | FC_IN_PARAM_NO_FREE_INST | 解放が行われなかったパラメーターとしての xmit/rep 内。 |
stack_size<1> は、スタック上のパラメーターのサイズであり、パラメーターがスタック上で占める整数の数として表されます。
手記
–Oi モードは、64 ビット プラットフォームではサポートされていません。
type_offset<2> フィールドは、引数の型記述子を示す、型書式指定文字列テーブル内のオフセットです。
–Oif パラメーター記述子
パラメーターの説明には 2 つの形式があり、1 つは基本型用で、もう 1 つは他のすべての型に使用できます。
基本型:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_format_char<1>
unused<1>
他:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_offset<2>
どちらのstack_offset<2> でも、仮想引数スタックのオフセットがバイト単位で示されます。 基本型の場合、引数の型は型に対応する書式文字によって直接指定されます。 他の型の場合、type_offset<2> フィールドは、引数の型記述子が配置されている型書式指定文字列テーブル内のオフセットを指定します。
パラメーター属性フィールドは次のように定義されます。
typedef struct
{
unsigned short MustSize : 1; // 0x0001
unsigned short MustFree : 1; // 0x0002
unsigned short IsPipe : 1; // 0x0004
unsigned short IsIn : 1; // 0x0008
unsigned short IsOut : 1; // 0x0010
unsigned short IsReturn : 1; // 0x0020
unsigned short IsBasetype : 1; // 0x0040
unsigned short IsByValue : 1; // 0x0080
unsigned short IsSimpleRef : 1; // 0x0100
unsigned short IsDontCallFreeInst : 1; // 0x0200
unsigned short SaveForAsyncFinish : 1; // 0x0400
unsigned short Unused : 2;
unsigned short ServerAllocSize : 3; // 0xe000
} PARAM_ATTRIBUTES, *PPARAM_ATTRIBUTES;
- MustSize ビットは、パラメーターのサイズを設定する必要がある場合にのみ設定されます。
- サーバーがパラメーターの NdrFree* ルーチンを呼び出す必要がある場合、MustFree ビットが設定されます。
- IsSimpleRef ビットは、別のポインター以外への参照ポインターであり、割り当て属性がないパラメーターに対して設定されます。 このような型の場合、パラメーターの説明の type_offset<> フィールドは、基本型への参照ポインターを除き、参照先の型へのオフセットを提供します。参照ポインターはスキップされます。
- IsDontCallFreeInst ビットは、空きインスタンス ルーチンを呼び出してはならない特定のrepresent_as パラメーターに対して設定されます。
- ServerAllocSize ビットは、パラメーターが [out]、[内の]、または [in,out] ポインターである場合は 0 以外であり、I_RpcAllocateの呼び出しを使用するのではなく、サーバー インタープリターのスタックで初期化されます。 0 以外の場合、この値に 8 を乗算して、パラメーターのバイト数を取得します。 そうすることで、ポインターに少なくとも 8 バイトが常に割り当てられることに注意してください。
- IsBasetype ビットは、メイン -Oif インタープリター ループによってマーシャリングされる単純型に対して設定されます。 特に、範囲属性を持つ単純型は、FC_RANGE トークンを使用したディスパッチによって範囲ルーチンのマーシャリングを強制するために、基本型としてフラグが設定されません。
- IsByValue ビットは、値によって送信される複合型に対して設定されますが、引数がポインターであるかどうかに関係なく、単純型には設定されません。 設定される複合型は、構造体、共用体、transmit_as、represent_as、wire_marshal、SAFEARRAY です。 一般に、ビットは、–Oicf インタープリターでメイン インタープリター ループの利点を得るために導入され、非シンプルな引数 (複合型引数と呼ばれます) が正しく逆参照されるようにしました。 このビットは、以前のバージョンのインタープリターでは使用されませんでした。