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