数组属性还可用于多维数组。 但是,请注意确保数组的每个维度都有相应的属性。 例如:
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(2.0)
]
interface multiarray
{
void arr2d( [in] short d1size,
[in] short d2len,
[in, size_is( d1size, ), length_is ( , d2len) ] long array2d[*][30] ) ;
}
前面的数组是 30 个元素数组的一个符合性数组(大小为 d1size)(每个数组附带 d2len 元素)。 [size_is] 属性括号中的逗号指定将 d1size 中的值应用于数组的第一个维度。 同样,[length_is] 属性括号中的命令指示将 d2len 中的值应用于数组的第二个维度。
MIDL 2.0 编译器提供两种方法用于封送参数:混合模式(/Os)和完全解释的(/Oif 或/Oicf)。 默认情况下,MIDL 编译器在混合模式下编译接口。 无需显式指定 /Os 开关即可获取混合模式封送处理。
完全解释的方法完全脱机封送数据。 这会大幅减小存根代码的大小,但也会导致性能下降。 在混合模式封送中,存根会联机封送某些参数。 虽然这会导致更大的存根大小,但它还提供更高的性能。
谨慎
在此模式下编译 IDL 文件时,请谨慎行事。 在混合模式下使用多维数组可能会导致参数未正确封送。 当接口定义多维数组的参数时,建议使用 /Oicf 命令行开关。
[字符串] 属性还可用于多维数组。 该属性适用于最不重要的维度,例如一个符合性字符串数组。 还可以使用多维指针属性。 例如:
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(2.0)
]
interface multiarray
{
void arr2d([in] short d1len,
[in] short d2len,
[in] size_is(d1len, d2len) ] long ** ptr2d) ;
}
在前面的示例中,变量 ptr2d 是指向 d1len 大小的指针块的指针,每个指针指向 d2len 指针,指向 长。
多维数组不等同于指针数组。 多维数组是内存中的单个大型数据块。 指针数组仅包含数组中的指针块。 指针指向的数据可以位于内存中的任意位置。 此外,ANSI C 语法仅允许在多维数组中未指定最重要的数组维度(最左侧)。 因此,下面是一个有效的语句:
long a1[] [20]
将此语句与以下无效语句进行比较:
long a1[20] []