Atributos direccionales (parámetros)
Los atributos direccionales describen si los datos se transmiten de cliente a servidor, servidor a cliente o ambos. Todos los parámetros del prototipo de función deben estar asociados a atributos direccionales. Las tres combinaciones posibles de atributos direccionales son: 1) [in], 2) [out] y 3) [in, out]. Describen el modo en que se pasan los parámetros entre llamar a y llamar a procedimientos. Cuando se compila en el valor predeterminado (modo extendido de Microsoft) y se omite un atributo direccional para un parámetro, el compilador MIDL asume un valor predeterminado de [in].
Un parámetro [out] debe ser un puntero. De hecho, el atributo [out] no es significativo cuando se aplica a parámetros que no actúan como punteros porque los parámetros de función de C se pasan por valor. En C, la función llamada recibe una copia privada del valor del parámetro; no puede cambiar el valor de la función de llamada para ese parámetro. Sin embargo, si el parámetro actúa como puntero, se puede usar para acceder a la memoria y modificarla. El atributo [out] indica que la función de servidor debe devolver el valor a la función de llamada del cliente y que la memoria asociada al puntero debe devolverse de acuerdo con los atributos asignados al puntero.
En la interfaz siguiente se muestran las tres combinaciones posibles de atributos direccionales que se pueden aplicar a un parámetro. La función InOutProc se define en el archivo IDL como:
void InOutProc ([in] short s1,
[in, out] short * ps2,
[out] float * pf3);
El primer parámetro, s1, es solo [in]. Su valor se transmite al equipo remoto, pero no se devuelve al procedimiento de llamada. Aunque la aplicación de servidor puede cambiar su valor para s1, el valor de s1 en el cliente es el mismo antes y después de la llamada.
El segundo parámetro, ps2, se define en el prototipo de función como puntero con atributos [in] y [out]. El atributo [in] indica que el valor del parámetro se pasa del cliente al servidor. El atributo [out] indica que el valor al que apunta ps2 se devuelve al cliente.
El tercer parámetro es solo [out]. El espacio se asigna para el parámetro en el servidor, pero el valor no está definido en la entrada. Como se mencionó anteriormente, todos los parámetros [out] deben ser punteros.
El procedimiento remoto cambia el valor de los tres parámetros, pero solo los nuevos valores de los parámetros [out] y [in] están disponibles para el 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;
}
Al volver de la llamada a InOutProc, se modifican los parámetros segundo y tercero. El primer parámetro, que es [in] solo, no cambia.