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.