Atributos direcionais (parâmetro)

Atributos direcionais descrevem se os dados são transmitidos de cliente para servidor, servidor para cliente ou 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) []e 3) [em, ]. Elas descrevem a maneira como os parâmetros são passados entre chamadas e procedimentos chamados. Quando você compila no padrão (modo estendido pela Microsoft) e omite um atributo direcional para um parâmetro, o compilador MIDL assume um valor padrão de [em].

Um parâmetro [] deve ser um ponteiro. Na verdade, o atributo [fora] não é significativo quando aplicado a parâmetros que não atuam como ponteiros porque os parâmetros de função C são passados por 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 de chamada para esse parâmetro. No entanto, se o parâmetro atuar como um ponteiro, ele poderá ser usado para acessar e modificar a memória. O atributo [] 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 de função como um ponteiro com atributos [em] e [] . O atributo [em] indica que o valor do parâmetro é passado do cliente para o servidor. O atributo [] indica que o valor apontado por ps2 é retornado ao cliente.

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

O procedimento remoto altera o valor de todos os três parâmetros, mas apenas os novos valores dos parâmetros [fora] e [em] 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;
}

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

em parâmetros

parâmetros

parâmetros in-out