Atributos direcionais (parâmetro)
Os 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) [in], 2) [out], e 3) [in, out]. Eles descrevem a maneira como os parâmetros são passados entre a chamada e os procedimentos chamados. Quando você compila no padrão (modo estendido da Microsoft) e omite um atributo direcional para um parâmetro, o compilador MIDL pressupõe um valor padrão de [in].
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 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 [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 aplicados 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, é somente [in]. Seu valor é transmitido para o computador remoto, mas não é retornado ao 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 [in] e [out]. O atributo [in] 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 é somente [out]. O espaço é alocado para o parâmetro no servidor, mas o valor é indefinido na entrada. Conforme 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 o terceiro parâmetros são modificados. O primeiro parâmetro, que é [in] apenas, não é alterado.