多维数组

数组属性还可以与多维数组一起使用。 但是,请务必确保数组的每个维度都有相应的属性。 例如:

/* 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] ) ;
}

前面的数组是大小为 d1size 的符合数组 () 30 个元素数组, (每个) 附带 d2len 元素。 [size_is] 属性的括号中的逗号指定将 d1size 中的值应用于数组的第一个维度。 同样,[length_is] 属性括号中的 命令指示将 d2len 中的值应用于数组的第二维。

MIDL 2.0 编译器提供两种用于封送参数的方法:混合模式 (/Os) 和完全解释的 (/Oif 或 /Oicf) 。 默认情况下,MIDL 编译器在混合模式下编译接口。 无需显式指定 /Os 开关即可获取混合模式封送处理。

完全解释的方法完全脱机封送数据。 这大大减少了存根代码的大小,但也会导致性能下降。 在混合模式封送处理中,存根会联机封送某些参数。 虽然这会导致存根大小更大,但它还提供更高的性能。

注意

在此模式下编译 IDL 文件时要小心。 在混合模式下使用多维数组可能会导致参数未正确封送。 当接口定义多维数组的参数时,建议使用 /Oicf 命令行开关。

 

[string] 属性还可以与多维数组一起使用。 属性适用于最低有效维度,例如一致的字符串数组。 还可以使用多维指针属性。 例如:

/* 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 大小的指针块的指针,每个指针都指向 指向 long 的 d2len 指针。

多维数组不等效于指针数组。 多维数组是内存中的单个大型数据块。 指针数组仅包含数组中的指针块。 指针指向的数据可以是内存中的任何位置。 此外,ANSI C 语法仅允许在多维数组中未指定最左侧 (最左侧) 数组维度。 因此,下面是一个有效的语句:

long a1[] [20]

将此语句与以下无效语句进行比较:

long a1[20] []