次の方法で共有


Microsoft RPC Binding-Handle 拡張機能

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

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] 明示的なハンドル パラメーターは、プリミティブ、プログラマ定義、コンテキスト ハンドルのいずれであるかに関係なく、バインディング ハンドルです。 ハンドル パラメーターがない場合、プロシージャは ACF 属性 [implicit_handle] または [auto_handle] を使用して暗黙的なバインディングを使用します。

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

  • 自動ハンドル バインドは、ACF が存在しない場合に使用されます。
  • 個々の関数の明示的な [in] または [] ハンドルは、インターフェイスに指定された暗黙的なバインディングをプリエンプションします。
  • 複数の [内の] または [, out] プリミティブ ハンドルはサポートされていません。
  • 複数の [] または [,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 );
最初のパラメーターはハンドルではありません。 既定モードでは、左端のハンドル パラメーター (H ) がバインド ハンドルです。 /osf モードでは、暗黙的なバインディングが使用されます。 2 番目のパラメーターが読み取り可能であると予想され、handle_tを送信できないため、エラーが報告されます。
typedef [handle] short * MY_HDL;void proc1([in] short s,           [in] MY_HDL H );
最初のパラメーターはハンドルではありません。 既定モードでは、左端のハンドル パラメーター (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 パラメーターはバインド ハンドルです。