多維陣列
陣列屬性也可以與多維度陣列搭配使用。 不過,請小心確保陣列的每個維度都有對應的屬性。 例如:
/* 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] []