[in, out, size_is]原型
以下函数原型使用单计数字符数组,该数组通过两种方式传递:从客户端到服务器,从服务器传递到客户端:
#define STRSIZE 500 //maximum string length
void Analyze(
[in, out, length_is(*pcbSize), size_is(STRSIZE)] char achInOut[],
[in, out] long *pcbSize);
作为 [] 参数中的 [,achInOut 必须指向客户端上的有效存储。 开发人员在进行远程过程调用之前,在客户端分配与数组关联的内存。
存根使用 [size_is] 参数 构造 在服务器上分配内存,然后使用 [length_is] 参数 将数组元素传输到此内存中。 在调用远程过程之前,开发人员必须确保客户端代码设置 [length_is] 变量。
在某些情况下,对输入和输出使用单独的参数而不是单个字符串更高效,并提供灵活性。 下一个示例演示了这一点:
/* client */
char achInOut[STRSIZE];
long cbSize;
...
gets_s(achInOut, STRSIZE); // get patient input
cbSize = strlen(achInOut) + 1; // transmit '\0' too
Analyze(achInOut, &cbSize);
在前面的示例中,字符数组 achInOut 也用作 [out] 参数。 在 C 中,数组的名称等效于指针的使用。 默认情况下,所有顶级指针都是引用指针 , 它们不会更改值,并且它们指向在调用前后客户端上的相同内存区域。 远程过程访问的所有内存必须符合客户端在调用之前指定的大小,否则存根将生成异常。
在返回之前,服务器上的 Analyze 函数必须重置 参数,以指示服务器将传输到客户端的元素数,如下所示:
/* server */
Analyze(char * str, long * pcbSize)
{
...
*pcbSize = strlen(str) + 1; // transmit '\0' too
return;
}