Extensões do Microsoft RPC Binding-Handle

As extensões da Microsoft para a linguagem IDL dão suporte a vários parâmetros de identificador que aparecem em posições diferentes do primeiro parâmetro mais à esquerda. As etapas a seguir descrevem a sequência pela qual o compilador MIDL passa para resolve o parâmetro binding-handle no modo de compatibilidade DCE (/osf) e no modo padrão (estendido pela Microsoft).

Modo de compatibilidade de DCE

  • Identificador de associação que aparece na primeira posição.
  • Parâmetro mais à esquerda [in, context_handle].
  • Identificador de associação implícita especificado por [implicit_handle] ou [auto_handle].
  • Se nenhum ACF estiver presente, o padrão será o uso de [auto_handle].

Modo padrão

  • Identificador de associação explícita mais à esquerda.
  • Identificador de associação implícita especificado por [implicit_handle] ou [auto_handle].
  • Se nenhum ACF estiver presente, o padrão será o uso de [auto_handle].

Os compiladores de IDL de DCE procuram um identificador de associação explícito como o primeiro parâmetro. Quando o primeiro parâmetro não é um identificador de associação e um ou mais identificadores de contexto são especificados, o identificador de contexto mais à esquerda é usado como o identificador de associação. Quando o primeiro parâmetro não é um identificador e não há identificadores de contexto, o procedimento usa a associação implícita usando o atributo ACF [implicit_handle] ou [auto_handle].

As extensões da Microsoft para a IDL permitem que o identificador de associação esteja em uma posição diferente do primeiro parâmetro. O parâmetro de identificador explícito [in] mais à esquerda, seja um identificador primitivo, definido pelo programador ou de contexto, é o identificador de associação. Quando não há parâmetros de identificador, o procedimento usa a associação implícita usando o atributo ACF [implicit_handle] ou [auto_handle].

As regras a seguir se aplicam ao modo de compatibilidade de DCE (/osf) e ao modo padrão:

  • A associação de identificador automático é usada quando nenhum ACF está presente.
  • Os identificadores [in] ou [in, out] explícitos para uma função individual preempõem qualquer associação implícita especificada para a interface.
  • Não há suporte para vários identificadores primitivos [in] ou [in, out].
  • Vários identificadores de contexto explícitos [in] ou [in, out] são permitidos.
  • Todos os parâmetros de identificador definidos pelo programador, exceto o parâmetro binding-handle, são tratados como dados transmissíveis.

A tabela a seguir contém exemplos e descreve como os identificadores de associação são atribuídos em cada modo de compilador.

Exemplo Descrição
void proc1( void );
Nenhum identificador explícito é especificado. O identificador de associação implícita, especificado por [ implicit_handle] ou [ auto_handle], é usado. Quando nenhum ACF está presente, um identificador automático é usado.
void proc2([in] handle_t H,           [in] short s );
Um identificador explícito do tipo handle_t é especificado. O parâmetro H é o identificador de associação do procedimento.
void proc3([in] short s,           [in] handle_t H );
O primeiro parâmetro não é um identificador. No modo padrão, o parâmetro de identificador mais à esquerda, H, é o identificador de associação. No modo /osf, a associação implícita é usada. Um erro é relatado porque espera-se que o segundo parâmetro seja transmissível e handle_t não possa ser transmitido.
typedef [handle] short * MY_HDL;void proc1([in] short s,           [in] MY_HDL H );
O primeiro parâmetro não é um identificador. No modo padrão, o parâmetro de identificador mais à esquerda, H, é o identificador de associação. Os stubs chamam as rotinas fornecidas pelo usuário MY_HDL_bind e MY_HDL_unbind. No modo/osf, a associação implícita é usada. O parâmetro de identificador definido pelo programador H é tratado como dados transmissíveis.
Typedef [handle] short * MY_HDL;void proc1([in] MY_HDL H,            [in] MY_HDL p );
O primeiro parâmetro é um identificador de associação. O parâmetro H é o parâmetro binding-handle. O segundo parâmetro de identificador definido pelo programador é tratado como dados transmissíveis.
Typedef [context_handle] void * CTXT_HDL;void proc1([in] short s,           [in] long l,           [in] CTXT_HDL H ,           [in] char c);
O identificador de associação é um identificador de contexto. O parâmetro H é o identificador de associação.