All parameters in the function prototype must be associated with directional attributes. The three possible combinations of directional attributes are: 1) in, 2) out, and 3) in, out. These describe the way parameters are passed between calling and called procedures. When you compile in the default (Microsoft-extended mode) and you omit a directional attribute for a parameter, the MIDL compiler assumes a default value of in.
An out parameter must be a pointer. In fact, the out attribute is not meaningful when applied to parameters that do not act as pointers because C function parameters are passed by value. In C, the called function receives a private copy of the parameter value; it cannot change the calling function's value for that parameter. If the parameter acts as a pointer, however, it can be used to access and modify memory. The out attribute indicates that the server function should return the value to the client's calling function, and that memory associated with the pointer should be returned in accordance with the attributes assigned to the pointer.
The following interface demonstrates the three possible combinations of directional attributes that can be applied to a parameter. The function InOutProc is defined in the IDL file as:
void InOutProc ([in] short s1,
[in, out] short * ps2,
[out] float * pf3);
The first parameter, s1, is in only. Its value is transmitted to the remote computer, but is not returned to the calling procedure. Although the server application can change its value for s1, the value of s1 on the client is the same before and after the call.
The second parameter, ps2, is defined in the function prototype as a pointer with both in and out attributes. The in attribute indicates that the value of the parameter is passed from the client to the server. The out attribute indicates that the value pointed to by ps2 is returned to the client.
The third parameter is out only. Space is allocated for the parameter on the server, but the value is undefined on entry. As mentioned above, all out parameters must be pointers.
The remote procedure changes the value of all three parameters, but only the new values of the out and in, out parameters are available to the client.
#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;
}
On return from the call to InOutProc, the second and third parameters are modified. The first parameter, which is in only, is unchanged.