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

作为 [in] 参数, achInOut 必须指向客户端上的有效存储。 在进行远程过程调用之前,开发人员在客户端上分配与数组关联的内存。

存根使用 [size_is] 参数 strsize 在服务器上分配内存,然后使用 [length_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;
}