Partilhar via


Atributos direcionais (parâmetro)

Os atributos direcionais descrevem se os dados são transmitidos de cliente para servidor, de servidor para cliente ou de ambos. Todos os parâmetros no protótipo de função devem ser associados a atributos direcionais. As três combinações possíveis de atributos direcionais são: 1) [em], 2) [fora], e 3) [em, fora]. Eles descrevem a maneira como os parâmetros são passados entre os procedimentos de chamada e chamados. Quando você compila no padrão (modo estendido da Microsoft) e omite um atributo direcional para um parâmetro, o compilador MIDL assume um valor padrão de [em].

Um parâmetro [out] deve ser um ponteiro. Na verdade, o atributo [out] não é significativo quando aplicado a parâmetros que não atuam como ponteiros porque os parâmetros da função C são passados pelo valor. Em C, a função chamada recebe uma cópia privada do valor do parâmetro; ele não pode alterar o valor da função chamadora para esse parâmetro. Se o parâmetro atua como um ponteiro, no entanto, ele pode ser usado para acessar e modificar a memória. O atributo [out] indica que a função de servidor deve retornar o valor para a função de chamada do cliente e que a memória associada ao ponteiro deve ser retornada de acordo com os atributos atribuídos ao ponteiro.

A interface a seguir demonstra as três combinações possíveis de atributos direcionais que podem ser aplicadas a um parâmetro. A função InOutProc é definida no arquivo IDL como:

void InOutProc ([in]       short     s1,
                [in, out]  short *  ps2,
                [out]      float *  pf3);

O primeiro parâmetro, s1, é [em] apenas. Seu valor é transmitido para o computador remoto, mas não é retornado para o procedimento de chamada. Embora o aplicativo de servidor possa alterar seu valor para s1, o valor de s1 no cliente é o mesmo antes e depois da chamada.

O segundo parâmetro, ps2, é definido no protótipo da função como um ponteiro com atributos [em] e [fora]. O atributo [em] indica que o valor do parâmetro é passado do cliente para o servidor. O atributo [out] indica que o valor apontado por ps2 é retornado ao cliente.

O terceiro parâmetro é apenas [fora]. O espaço é alocado para o parâmetro no servidor, mas o valor é indefinido na entrada. Como mencionado acima, todos os parâmetros [out] devem ser ponteiros.

O procedimento remoto altera o valor de todos os três parâmetros, mas apenas os novos valores dos parâmetros [out] e [in] estão disponíveis para o cliente.

#define MAX 257

void InOutProc(short    s1,
               short * ps2,
               float * pf3)
{
    *pf3 = (float) s1 / (float) *ps2;
    *ps2 = (short) MAX - s1;
    s1++;  // in only; not changed on the client side
    return;
}

No retorno da chamada para InOutProc, o segundo e terceiro parâmetros são modificados. O primeiro parâmetro, que é apenas [em], permanece inalterado.

em parâmetros

parâmetros

parâmetros de entrada e saída