英語で読む

次の方法で共有


ハンドル

プロシージャ アドレスの書式指定文字列の説明では、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_INFOpGenericBindingInfo によって参照される汎用バインド ハンドルに対応するバインド ルーチンとバインド解除ルーチン用に予約されています。 暗黙的なバインド ハンドルの型は、書式指定文字列に示されます。

明示的なハンドル

明示的なハンドル型には、コンテキスト、ジェネリック、プリミティブの 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 ヘッダー

前述のように、 –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 ビットは現在、これを示しています。