长度、大小和方向属性

在客户端和服务器之间传递数组时,与大小相关的属性 [max_is] 和 [size_is] 确定服务器存根分配的数组元素数。 长度相关的属性 [length_is]、[first_is] 和 [last_is] 确定要传输到服务器和客户端的元素数。

可以将不同的方向属性应用于参数。 但是,方向属性的某些组合可能会导致错误。 例如,假设您正在编写一个接口,该接口指定具有两个参数、一个数组和该数组的传输长度的过程。 术语 dir_attr 是指应用于参数的方向属性,如下所示:

Proc1(
    [dir_attr] short *plength;
    [dir_attr, length_is(pLength)] short array[MAX_SIZE]);

下表描述了每个方向属性组合的 MIDL 编译器行为。

数组 Length 参数 从客户端到服务器调用期间的存根操作 从服务器返回客户端时执行的存根操作
[in] [in] 传输由 参数指示的元素的长度和数量。 未传输任何数据。
[in] [out] 不合法;MIDL 编译器错误。 不合法;MIDL 编译器错误。
[in] [inout] 传输长度和长度参数指示的元素数。 仅传输长度。
[out] [in] 传输长度。
如果数组大小是固定的,请在服务器上分配数组大小,但不传输任何元素。
如果未绑定数组大小,则不合法:MIDL 编译器错误。
传输长度指示的元素数。
请注意,长度可以更改,并且可以具有与客户端上的 值不同的值。 不要传输长度。
[out] [out] 为服务器上的 length 参数分配空间,但不传输参数。 如果数组大小是固定的,请在服务器上分配数组大小,但不传输任何元素。
如果数组大小不固定,则不合法:MIDL 编译器错误。
传输长度和由服务器应用程序设置的长度指示的元素数。
[out] [inout] 传输 length 参数。 如果数组大小已绑定,请在服务器上分配数组大小,但不传输任何元素。
如果未绑定数组大小,则不合法:MIDL 编译器错误。
传输长度。 传输长度指示的数组元素数。
[inout] [in] 传输由 参数指示的元素的长度和数量。 不要传输长度。 传输长度指示的元素数。
请注意,长度可以更改,并且可以具有与客户端上原始值不同的值。
[inout] [out] 不合法;MIDL 编译器错误。 不合法;MIDL 编译器错误。
[inout] [inout] 传输由 参数指示的元素的长度和数量。 传输由 参数指示的元素的长度和数量。

通常,不应在服务器端修改长度或大小参数。 如果更改 length 参数,则可以孤立内存。 有关详细信息,请参阅 内存孤立