Microsoft RPC Binding-Handle扩展

IDL 语言的 Microsoft 扩展支持多个句柄参数,这些参数显示在第一个最左侧参数以外的位置。 以下步骤描述了 MIDL 编译器在 DCE 兼容模式 (/osf) 以及默认 (Microsoft 扩展) 模式下解析绑定句柄参数的顺序。

DCE 兼容性模式

  • 显示在第一个位置的绑定句柄。
  • 最左侧的 [incontext_handle] 参数。
  • 由 [implicit_handle] 或 [auto_handle] 指定的隐式绑定句柄。
  • 如果没有 ACF,则默认使用 [auto_handle]。

默认模式

DCE IDL 编译器查找显式绑定句柄作为第一个参数。 如果第一个参数不是绑定句柄,并且指定了一个或多个上下文句柄,则最左侧的上下文句柄用作绑定句柄。 当第一个参数不是句柄且没有上下文句柄时,该过程使用使用 ACF 属性 [implicit_handle] 或 [auto_handle] 的隐式绑定。

IDL 的 Microsoft 扩展允许绑定句柄位于第一个参数以外的位置。 最左边的 [in] 显式句柄参数(无论是基元、程序员定义的还是上下文句柄)是绑定句柄。 如果没有句柄参数,则过程使用使用 ACF 属性 [implicit_handle] 或 [auto_handle] 的隐式绑定。

以下规则适用于 DCE 兼容性 (/osf) 模式和默认模式:

  • 当不存在 ACF 时,使用自动句柄绑定。
  • 单个函数的显式 [in] 或 [inout] 句柄会抢占为接口指定的任何隐式绑定。
  • 不支持多个 [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 );
第一个参数不是句柄。 在默认模式下,最左侧的句柄参数 H 是绑定句柄。 在 /osf 模式下,使用隐式绑定。 报告错误是因为第二个参数应可传输,并且无法传输handle_t。
typedef [handle] short * MY_HDL;void proc1([in] short s,           [in] MY_HDL H );
第一个参数不是句柄。 在默认模式下,最左侧的句柄参数 H 是绑定句柄。 存根调用用户提供的例程MY_HDL_bind和MY_HDL_unbind。 在/osf 模式下,使用隐式绑定。 程序员定义的句柄参数 H 被视为可传递的数据。
Typedef [handle] short * MY_HDL;void proc1([in] MY_HDL H,            [in] MY_HDL p );
第一个参数是绑定句柄。 参数 H 是绑定句柄参数。 程序员定义的第二个句柄参数被视为可传递的数据。
Typedef [context_handle] void * CTXT_HDL;void proc1([in] short s,           [in] long l,           [in] CTXT_HDL H ,           [in] char c);
绑定句柄是上下文句柄。 参数 H 是绑定句柄。