Extensiones rpc de Microsoft Binding-Handle

Las extensiones de Microsoft para el lenguaje IDL admiten varios parámetros de identificador que aparecen en posiciones distintas del primer parámetro, situado más a la izquierda. En los pasos siguientes se describe la secuencia a la que pasa el compilador MIDL para resolver el parámetro binding-handle en el modo de compatibilidad DCE (/osf) y en modo predeterminado (extendido por Microsoft).

Modo de compatibilidad con DCE

  • Identificador de enlace que aparece en la primera posición.
  • Parámetro [in, context_handle] situado más a la izquierda.
  • Identificador de enlace implícito especificado por [implicit_handle] o [auto_handle].
  • Si no hay ningún ACF presente, el valor predeterminado es el uso de [auto_handle].

Modo predeterminado

  • Identificador de enlace explícito más a la izquierda.
  • Identificador de enlace implícito especificado por [implicit_handle] o [auto_handle].
  • Si no hay ningún ACF presente, el valor predeterminado es el uso de [auto_handle].

Los compiladores IDL de DCE buscan un identificador de enlace explícito como primer parámetro. Cuando el primer parámetro no es un identificador de enlace y se especifican uno o varios identificadores de contexto, el identificador de contexto más a la izquierda se usa como identificador de enlace. Cuando el primer parámetro no es un identificador y no hay identificadores de contexto, el procedimiento usa el enlace implícito mediante el atributo ACF [implicit_handle] o [auto_handle].

Las extensiones de Microsoft al IDL permiten que el identificador de enlace esté en una posición distinta del primer parámetro. El parámetro [in] explicit-handle más a la izquierda, ya sea un identificador primitivo, definido por el programador o un controlador de contexto, es el identificador de enlace. Cuando no hay parámetros de identificador, el procedimiento usa el enlace implícito mediante el atributo ACF [implicit_handle] o [auto_handle].

Las reglas siguientes se aplican tanto al modo de compatibilidad con DCE (/osf) como al modo predeterminado:

  • El enlace de control automático se usa cuando no hay ningún ACF presente.
  • Identificadores explícitos [in] o [in, out] para una función individual preempt cualquier enlace implícito especificado para la interfaz.
  • No se admiten varios identificadores primitivos [in] o [in, out].
  • Se permiten varios identificadores de contexto explícitos [in] o [in, out].
  • Todos los parámetros de identificador definidos por el programador, excepto el parámetro binding-handle, se tratan como datos transmisibles.

La tabla siguiente contiene ejemplos y describe cómo se asignan los identificadores de enlace en cada modo de compilador.

Ejemplo Descripción
void proc1( void );
No se especifica ningún identificador explícito. Se usa el identificador de enlace implícito, especificado por [ implicit_handle] o [ auto_handle]. Cuando no hay ningún controlador ACF, se usa un identificador automático.
void proc2([in] handle_t H,           [in] short s );
Se especifica un identificador explícito de tipo handle_t. El parámetro H es el identificador de enlace del procedimiento.
void proc3([in] short s,           [in] handle_t H );
El primer parámetro no es un identificador. En el modo predeterminado, el parámetro de identificador más a la izquierda, H, es el identificador de enlace. En el modo /osf, se usa el enlace implícito. Se notifica un error porque se espera que el segundo parámetro sea transmisible y handle_t no se pueda transmitir.
typedef [handle] short * MY_HDL;void proc1([in] short s,           [in] MY_HDL H );
El primer parámetro no es un identificador. En el modo predeterminado, el parámetro de identificador más a la izquierda, H, es el identificador de enlace. Los códigos auxiliares llaman a las rutinas proporcionadas por el usuario MY_HDL_bind y MY_HDL_unbind. En modo in/osf, se usa el enlace implícito. El parámetro de identificador definido por el programador H se trata como datos transmisibles.
Typedef [handle] short * MY_HDL;void proc1([in] MY_HDL H,            [in] MY_HDL p );
El primer parámetro es un identificador de enlace. El parámetro H es el parámetro binding-handle. El segundo parámetro de identificador definido por el programador se trata como datos transmisibles.
Typedef [context_handle] void * CTXT_HDL;void proc1([in] short s,           [in] long l,           [in] CTXT_HDL H ,           [in] char c);
El identificador de enlace es un identificador de contexto. El parámetro H es el identificador de enlace.