Share via


Microsoft RPC Binding-Handle Extensions

IDL 言語に対する Microsoft 拡張機能では、最初の左端のパラメーター以外の位置に表示される複数のハンドル パラメーターがサポートされています。 次の手順では、MIDL コンパイラが DCE 互換モード (/osf)、および既定 (Microsoft 拡張) モードでバインド ハンドル パラメーターを解決するために実行するシーケンスについて説明します。

DCE 互換モード

  • 最初の位置に表示されるバインド ハンドル。
  • 左端の [in, context_handle] パラメーター。
  • [implicit_handle] または [auto_handle] で指定された暗黙的なバインド ハンドル。
  • ACF が存在しない場合、既定では [auto_handle] が使用されます。

既定モード

  • 左端の明示的なバインド ハンドル。
  • [implicit_handle] または [auto_handle] で指定された暗黙的なバインド ハンドル。
  • ACF が存在しない場合、既定では [auto_handle] が使用されます。

DCE IDL コンパイラは、明示的なバインド ハンドルを最初のパラメーターとして検索します。 最初のパラメーターがバインド ハンドルではなく、1 つ以上のコンテキスト ハンドルが指定されている場合、左端のコンテキスト ハンドルがバインド ハンドルとして使用されます。 最初のパラメーターがハンドルではなく、コンテキスト ハンドルがない場合、プロシージャは ACF 属性 [implicit_handle] または [auto_handle] を使用して暗黙的なバインディングを使用します。

IDL に対する Microsoft 拡張機能を使用すると、バインド ハンドルを最初のパラメーター以外の位置に配置できます。 左端の [in] explicit-handle パラメーターは、プリミティブ、プログラマ定義、またはコンテキスト ハンドルのいずれであるかに関係なく、バインド ハンドルです。 ハンドル パラメーターがない場合、プロシージャは ACF 属性 [implicit_handle] または [auto_handle] を使用して暗黙的なバインディング使用します。

次の規則は、DCE 互換 (/osf) モードと既定モードの両方に適用されます。

  • 自動ハンドル バインドは、ACF が存在しない場合に使用されます。
  • 個々の関数の明示的な [in] または [in, out] ハンドルは、インターフェイスに指定された暗黙的なバインディングを優先します。
  • 複数の [in] または [in, out] プリミティブ ハンドルはサポートされていません。
  • 複数の [in] または [in, out] 明示的なコンテキスト ハンドルが許可されます。
  • バインディング ハンドル パラメーターを除くすべてのプログラマ定義ハンドル パラメーターは、読み取り可能なデータとして扱われます。

次の表に例を示し、各コンパイラ モードでバインド ハンドルを割り当てる方法について説明します。

説明
void proc1( void );
明示的なハンドルは指定されません。 [ implicit_handle] または [ auto_handle] で指定された暗黙的なバインド ハンドルが使用されます。 ACF が存在しない場合は、自動ハンドルが使用されます。
void proc2([in] handle_t H,           [in] short s );
handle_t型の明示的なハンドルを指定します。 パラメーター H は、プロシージャのバインド ハンドルです。
void proc3([in] short s,           [in] handle_t H );
最初のパラメーターはハンドルではありません。 既定モードでは、左端の handle パラメーター H がバインド ハンドルです。 /osf モードでは、暗黙的なバインディングが使用されます。 2 番目のパラメーターが読み取り可能であると予想され、handle_tを送信できないため、エラーが報告されます。
typedef [handle] short * MY_HDL;void proc1([in] short s,           [in] MY_HDL H );
最初のパラメーターはハンドルではありません。 既定モードでは、左端の handle パラメーター H がバインド ハンドルです。 スタブは、ユーザーが指定したルーチンMY_HDL_bind呼び出し、MY_HDL_unbindします。 In/osf モードでは、暗黙的なバインディングが使用されます。 プログラマー定義のハンドル・パラメーター H は、トランスミシブル・データとして扱われます。
Typedef [handle] short * MY_HDL;void proc1([in] MY_HDL H,            [in] MY_HDL p );
最初のパラメーターはバインド ハンドルです。 パラメーター H はバインド ハンドル パラメーターです。 2 番目のプログラマ定義のハンドル パラメーターは、読み取り可能なデータとして扱われます。
Typedef [context_handle] void * CTXT_HDL;void proc1([in] short s,           [in] long l,           [in] CTXT_HDL H ,           [in] char c);
バインディング ハンドルはコンテキスト ハンドルです。 パラメーター H はバインド ハンドルです。