length_is 特性
[length_is] 属性指定要传输的数组元素数。 必须指定非负值。
[length_is( limited-expression-list )]
-
limited-expression-list
-
指定一个或多个 C 语言表达式。 每个表达式的计算结果为一个整数,该整数表示要传输的数组元素数。 MIDL 编译器支持条件表达式、逻辑表达式、关系表达式和算术表达式。 MIDL 不允许在表达式中调用函数,也不允许递增和递减运算符。 用逗号分隔多个表达式。
未指定 [last_is] 时,[length_is] 属性确定对应于 [last_is] 属性的数组索引的值。 这些数组索引之间的关系如下:length = last - first + 1。
[length_is] 属性不能与 [last_is] 属性或 [string] 属性同时使用。
若要定义具有 [length_is] 或 [last_is] 属性的计数字符串,请使用不带 [string] 属性的字符数组或指针。
将常量表达式与 [length_is] 属性一起使用是不恰当的。 这是合法的,但效率低下,并将导致代码封送处理速度变慢。
可以将 [size_is] 和 [length_is] 属性一起使用。 执行此操作时, [size_is] 属性控制为数据分配的内存量。 [length_is] 属性指定传输的元素数。 [size_is] 和 [length_is] 属性指定的内存量不需要相同。 例如,客户端可能会将 [in, out] 参数传递给服务器,并使用 [size_is] 指定较大的内存分配,即使它指定要使用 [length_is] 传递的少量数据元素。 这使服务器能够用比收到的更多的数据填充数组,然后可以将其发送回客户端。
通常,在 [in] 或 [out] 参数上同时指定 [size_is] 和 [length_is]没有用。 在这两种情况下, [size_is] 控制内存分配。 应用程序可以使用 [size_is] 分配比 [length_is]) 指定的传输 ( 更多的数组元素。 但是,这将效率低下。 为 [size_is] 和 [length_is] 指定相同的值也效率低下。 因为它会在参数封送期间产生额外的开销。 如果 [size_is] 和 [length_is] 的值始终相同,请省略 [length_is] 属性。
/* counted string holding at most "size" characters */
typedef struct
{
unsigned short size;
unsigned short length;
[size_is(size), length_is(length)] char string[*];
} COUNTED_STRING_TYPE;
/* counted string holding at most 80 characters */
typedef struct
{
unsigned short length;
[length_is(length)] char string[80];
} STATIC_COUNTED_STRING_TYPE;
HRESULT Proc1(
[in] short iLength;
[in, length_is(iLength)] short asNumbers[10]);