[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;
}