Desenvolvimento de interface usando identificadores de contexto

Normalmente, você cria um identificador de contexto especificando o atributo [context_handle] em uma definição de tipo no arquivo IDL. A definição de tipo também especifica implicitamente uma rotina de execução de contexto, que você deve fornecer. Se a comunicação entre o cliente e o servidor for interrompida, o tempo de execução do servidor invocará essa rotina para executar qualquer limpeza necessária. Para obter mais informações sobre rotinas de execução de contexto, consulte Rotina de execução de contexto do servidor.

Uma interface que usa um identificador de contexto deve ter um identificador de associação para a associação inicial, que deve ocorrer antes que o servidor possa retornar um identificador de contexto. Você pode usar um identificador de associação automático, implícito ou explícito para criar a associação e estabelecer o contexto.

Um identificador de contexto deve ser do tipo void * ou um tipo que resolve para void *. O programa de servidor o converte no tipo necessário.

Observação

O uso de [in, out] para parâmetros de identificador de contexto é desencorajado, exceto para rotinas que fecham os identificadores de contexto. Se o contexto manipular parâmetros marcados como [in, out] forem usados, não passe um identificador de contexto NULL ou não inicializado do cliente para o servidor. Um ponteiro NULL para um identificador de contexto deve ser passado. Observe que os parâmetros de identificador de contexto marcados [in] não aceitam ponteiros NULL .

 

O fragmento a seguir de uma definição de interface de exemplo mostra como um aplicativo distribuído pode usar um identificador de contexto para que um servidor seja aberto e atualize um arquivo de dados para cada cliente.

A interface deve conter uma chamada de procedimento remoto para inicializar o identificador e defini-lo como um valor não nulo . Neste exemplo, a função RemoteOpen executa essa operação. Ele especifica o identificador de contexto com um atributo direcional [out]. Como alternativa, você pode retornar o identificador de contexto como o valor retornado do procedimento. No entanto, neste exemplo, passaremos o identificador de contexto pela lista de parâmetros.

Neste exemplo, as informações de contexto são um identificador de arquivo. Ele mantém o controle do local atual no arquivo. A interface empacota o identificador de arquivo como um identificador de contexto e passa-o como um parâmetro para chamadas de procedimento remoto. Uma estrutura contém o nome do arquivo e o identificador de arquivo.

/* file: cxhndl.idl (fragment of interface definition file) */
typedef [context_handle] void * PCONTEXT_HANDLE_TYPE;
typedef [ref] PCONTEXT_HANDLE_TYPE * PPCONTEXT_HANDLE_TYPE;
 
short RemoteOpen([out] PPCONTEXT_HANDLE_TYPE pphContext,
    [in, string] unsigned char * pszFile);
 
void RemoteRead(
    [in] PCONTEXT_HANDLE_TYPE phContext,
    [out, size_is(cbBuf)] unsigned char achBuf[],
    [in, out] short *pcbBuf);
 
short RemoteClose([in, out] PPCONTEXT_HANDLE_TYPE pphContext);

A função RemoteOpen cria um identificador de contexto válido e não nulo . Ele passa o identificador de contexto para o cliente. Chamadas de procedimento remoto subsequentes, como RemoteRead, usam o identificador de contexto como um ponteiro in.

Além do procedimento remoto que inicializa o identificador de contexto, a interface deve conter um procedimento que libere o contexto do servidor e defina o identificador de contexto como NULL. No exemplo anterior, a função RemoteClose executa essa operação.