方向 (参数) 属性
方向属性描述数据是从客户端传输到服务器还是从服务器传输到客户端,还是同时传输两者。 函数原型中的所有参数都必须与方向属性相关联。 方向属性的三种可能组合是:1) [in]、2) [out] 和 3) [in, out]。 这些描述在调用过程和调用过程之间传递参数的方式。 在默认 (Microsoft 扩展模式) 编译时,如果省略参数的方向属性,则 MIDL 编译器假定默认值为 [in]。
[out] 参数必须是指针。 事实上,[out] 属性应用于不充当指针的参数时没有意义,因为 C 函数参数是按值传递的。 在 C 中,被调用的函数接收参数值的私有副本;它无法更改该参数的调用函数的值。 但是,如果 参数充当指针,则可用于访问和修改内存。 [out] 属性指示服务器函数应将值返回到客户端的调用函数,并且应根据分配给指针的属性返回与指针关联的内存。
以下接口演示了可应用于参数的方向属性的三种可能组合。 函数 InOutProc 在 IDL 文件中定义为:
void InOutProc ([in] short s1,
[in, out] short * ps2,
[out] float * pf3);
第一个参数 s1 仅为 [in]。 其值将传输到远程计算机,但不返回到调用过程。 尽管服务器应用程序可以更改其 s1 的值,但客户端上的 s1 值在调用之前和之后是相同的。
第二个参数 ps2 在函数原型中定义为具有 [in] 和 [out] 属性的指针。 [in] 属性指示参数的值从客户端传递到服务器。 [out] 属性指示 ps2 指向的值将返回到客户端。
第三个参数仅为 [out]。 为服务器上的 参数分配空间,但值在条目上未定义。 如上所述,所有 [out] 参数必须是指针。
远程过程更改所有三个参数的值,但客户端只能使用 [out] 和 [in] 参数的新值。
#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;
}
从 调用 InOutProc 返回时,将修改第二个和第三个参数。 第一个参数(仅限 [in])保持不变。