Identificadores de Associação Implícita

Os identificadores de associação implícita permitem que seu aplicativo selecione um servidor específico para executar suas chamadas de procedimento remoto. Para obter detalhes, consulte Associação do lado do cliente. Eles também permitem que seu programa cliente/servidor use associações autenticadas. Ou seja, o cliente pode especificar informações de autenticação em um identificador de associação implícita. A biblioteca de tempo de execução RPC usa as informações de autenticação para estabelecer uma sessão RPC autenticada entre o cliente e o servidor. Para saber mais, consulte Segurança.

Observação

Os identificadores de associação implícita não são thread-safe. Portanto, aplicativos com vários threads devem evitar o uso de identificadores de associação implícitas.

 

Quando o aplicativo usa associações implícitas, o cliente deve definir as informações de associação para que ele possa criar a associação. Depois que o cliente cria uma associação implícita, ele não precisa passar identificadores de associação para procedimentos remotos. A biblioteca RPC manipula o restante da mecânica da sessão de comunicação.

O cliente armazena as informações de associação para um identificador implícito em uma variável global. Quando o compilador MIDL gera o stub do cliente e o arquivo de cabeçalho da especificação da interface no arquivo MIDL, ele também gera código para uma variável de identificador de associação global. Seu programa cliente inicializa o identificador e, em seguida, não se refere a ele novamente até que ele destrua a associação.

Você cria um identificador implícito especificando o atributo [implicit_handle] no ACF para uma interface da seguinte maneira:

/* ACF file (complete) */
 
[
  implicit_handle(handle_t hHello)
]
interface hello
{
}

O tipo de handle_t , que é usado no exemplo anterior, é um tipo de dados MIDL usado para definir identificadores de associação.

Depois de criar o identificador implícito, o aplicativo precisa usá-lo como um parâmetro para as funções de biblioteca de tempo de execução RPC. Não use o identificador implícito como um parâmetro para chamadas de procedimento remoto. O exemplo de código a seguir demonstra o uso de identificadores de associação implícita.

RPC_STATUS status;
status = RpcBindingFromStringBinding(
            pszStringBinding,
            &hHello);
 
status = MyRemoteProcedure();
 
status = RpcBindingFree(hHello);
...

No exemplo anterior, as funções de biblioteca de tempo de execução RPC RpcBindingFromStringBinding e RpcBindingFree exigiam que o identificador de associação implícita fosse passado em suas listas de parâmetros. No entanto, o procedimento remoto MyRemoteProcedure não, pois não é uma função de biblioteca de tempo de execução RPC.