ハンドル
プロシージャ アドレスの書式指定文字列の説明では、2 つの部分が処理されます。 最初の部分は、暗黙的なハンドルを示すために使用される、プロシージャの説明のhandle_type<1> フィールドです。 この部分は常に存在します。 2 番目の部分は、プロシージャ内の明示的なハンドルのパラメーターの説明です。 どちらも、バインディング ハンドルの問題に対するスタブ記述子構造体の追加の MIDL コンパイラ サポートの説明と共に、次のセクションで説明します。
プロシージャがバインディングに暗黙的なハンドルを使用する場合、プロシージャの説明のhandle_type<1 フィールドには、3> つの有効な 0 以外の値のいずれかが含まれます。 暗黙的なハンドルに対する MIDL コンパイラのサポートは、スタブ記述子構造体の IMPLICIT_HANDLE_INFO フィールドにあります。
typedef (__RPC_FAR * GENERIC_BINDING_ROUTINE)();
typedef struct
{
GENERIC_BINDING_ROUTINE pfnBind;
GENERIC_BINDING_ROUTINE pfnUnbind;
} GENERIC_BINDING_ROUTINE_PAIR;
typedef struct __GENERIC_BINDING_INFO
{
void __RPC_FAR* pObj;
unsigned char Size;
GENERIC_BINDING_ROUTINE pfnBind;
GENERIC_BINDING_ROUTINE pfnUnbind;
} GENERIC_BINDING_INFO, *PGENERIC_BINDING_INFO;
union
{
handle_t* pAutoHandle;
handle_t* pPrimitiveHandle;
PGENERIC_BINDING_INFO pGenericBindingInfo;
} IMPLICIT_HANDLE_INFO;
プロシージャで自動ハンドルが使用されている場合、 pAutoHandle メンバーには、定義されたスタブの自動ハンドル変数のアドレスが含まれます。
プロシージャで暗黙的なプリミティブ ハンドルを使用する場合、 pPrimitiveHandle メンバーにはスタブ定義プリミティブ ハンドル変数のアドレスが含まれます。
最後に、プロシージャで暗黙的なジェネリック ハンドルが使用されている場合、 pGenericBindingInfo メンバーは、対応する GENERIC_BINDING_INFO 構造体へのポインターのアドレスを保持します。 データ構造 MIDL_STUB_DESC には、 GENERIC_BINDING_PAIR 構造体のコレクションへのポインターが含まれています。 このコレクションの 0 位置のエントリは、IMPLICIT_HANDLE_INFOの pGenericBindingInfo によって参照される汎用バインド ハンドルに対応するバインド ルーチンとバインド解除ルーチン用に予約されています。 暗黙的なバインド ハンドルの型は、書式指定文字列に示されます。
明示的なハンドル型には、コンテキスト、ジェネリック、プリミティブの 3 種類があります。 明示的なハンドル (または同じ方法で処理される [out] のみのコンテキスト ハンドル) の場合、バインディング ハンドル情報はプロシージャのパラメーターの 1 つとして表示されます。 考えられる 3 つの説明は次のとおりです。
プリミティブ
FC_BIND_PRIMITIVE, flag<1>, offset<2>.
フラグ<1> は、ハンドルがポインターによって渡されるかどうかを示します。
オフセット<2> は、スタックの先頭からプリミティブ ハンドルへのオフセットを提供します。
注意
型書式指定文字列のプリミティブ ハンドルの説明は、1 つのFC_IGNOREに縮小されます。
ジェネリック
FC_BIND_GENERIC, flag_and_size<1>, offset<2>, binding_routine_pair_index<1>, FC_PAD
flag_and _size<1> には、上部のフラグ ニブルと小さいサイズのニブルがあります。 フラグは、ハンドルがポインターによって渡されるかどうかを示します。 size フィールドは、ユーザー定義の汎用ハンドル型のサイズを提供します。 このサイズは、32 ビット システムでは 1、2、または 4 バイト、64 ビット システムでは 1、2、4、または 8 バイトに制限されます。
オフセット<2> フィールドは、ポインターのスタックの先頭から指定されたサイズのデータへのオフセットを提供します。
binding_routine_pair_index<1> フィールドは、スタブ記述子の aGenericBindingRoutinePairs フィールドに、汎用ハンドルの バインド および バインド解除 ルーチン関数ポインターにインデックスを渡します。
注意
型形式の汎用ハンドルの説明は、関連するデータ型の説明のみです。
Context
FC_BIND_CONTEXT flags<1> offset<2> context_rundown_routine_index<1> param_num<1>
フラグ<1> は、ハンドルの受け渡し方法と型を示します。 有効なフラグを次の表に示します。
Hex | フラグ |
---|---|
80 | HANDLE_PARAM_IS_VIA_PTR |
40 | HANDLE_PARAM_IS_IN |
20 | HANDLE_PARAM_IS_OUT |
21 | HANDLE_PARAM_IS_RETURN |
08 | NDR_STRICT_CONTEXT_HANDLE |
04 | NDR_CONTEXT_HANDLE_NO_SERIALIZE |
02 | NDR_CONTEXT_HANDLE_SERIALIZE |
01 | NDR_CONTEXT_HANDLE_CANNOT_BE_NULL |
最初の 4 つのフラグは常に存在し、最後の 4 つのフラグは Windows 2000 で追加されました。
オフセット<2> フィールドは、スタックの先頭からコンテキスト ハンドルへのオフセットを提供します。
context_rundown_routine_index<1> は、スタブ記述子の apfnNdrRundownRoutines フィールドに、このコンテキスト ハンドルに使用されるランダウン ルーチンへのインデックスを提供します。 コンパイラは常にインデックスを生成します。 ランダウン ルーチンを持たないルーチンの場合、これは null を保持するテーブル位置へのインデックスです。
–Oi2 に組み込まれたスタブの場合、param_num<1> は序数を提供し、0 から始まり、指定されたプロシージャ内のコンテキスト ハンドルを指定します。
以前のバージョンのインタープリターの場合、param_num<1> は、プロシージャ内の 0 から始まるコンテキスト ハンドルのパラメーター番号を提供します。
注意
型書式指定文字列のコンテキスト ハンドルの説明では、説明のオフセット<2> は含まれません。
前述のように、 –Oif ヘッダーは –Oi ヘッダーで展開されます。 便宜上、すべてのフィールドを次に示します。
(古いヘッダー)
handle_type<1>
Oi_flags<1>
[rpc_flags<4>]
proc_num<2>
stack_size<2>
[explicit_handle_description<>]
( –Oif 拡張機能)
constant_client_buffer_size<2>
constant_server_buffer_size<2>
INTERPRETER_OPT_FLAGS<1>
number_of_params<1>
constant_client_buffer_size<2> は、コンパイラによって事前に計算された可能性があるマーシャリング バッファーのサイズを提供します。 ClientMustSize フラグによってサイズ変更がトリガーされるので、これは部分的なサイズのみである可能性があります。
constant_server_buffer_size<2> は、コンパイラによって事前計算されたマーシャリング バッファーのサイズを提供します。 ServerMustSize フラグによってサイズ変更がトリガーされるので、これは部分的なサイズのみである可能性があります。
INTERPRETER_OPT_FLAGSは Ndrtypes.h で定義されています。
typedef struct
{
unsigned char ServerMustSize : 1; // 0x01
unsigned char ClientMustSize : 1; // 0x02
unsigned char HasReturn : 1; // 0x04
unsigned char HasPipes : 1; // 0x08
unsigned char Unused : 1;
unsigned char HasAsyncUuid : 1; // 0x20
unsigned char HasExtensions : 1; // 0x40
unsigned char HasAsyncHandle : 1; // 0x80
} INTERPRETER_OPT_FLAGS, *PINTERPRETER_OPT_FLAGS;
- サーバーがバッファー サイズ変更パスを実行する必要がある場合、ServerMustSize ビットが設定されます。
- ClientMustSize ビットは、クライアントがバッファー サイズ変更パスを実行する必要がある場合に設定されます。
- プロシージャに戻り値がある場合、HasReturn ビットが設定されます。
- パイプ引数をサポートするためにパイプ パッケージを使用する必要がある場合は、HasPipes ビットが設定されます。
- HasAsyncUuid ビットは、プロシージャが非同期 DCOM プロシージャの場合に設定されます。
- HasExtensions ビットは、Windows 2000 以降の拡張機能が使用されていることを示します。
- HasAsyncHandle ビットは、非同期 RPC プロシージャを示します。
HasAsyncHandle ビットは、最初は非同期サポートの別の DCOM 実装に使用されているため、DCOM の現在のスタイルの非同期サポートには使用できませんでした。 HasAsyncUuid ビットは現在、これを示しています。