多維陣列

陣列屬性也可以與多維度陣列搭配使用。 不過,請小心確保陣列的每個維度都有對應的屬性。 例如:

/* 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] []