MIDL 陣列

陣列宣告子會出現在IDL檔案的介面主體中,如下所示:

  • 一般宣告的一部分
  • 結構或等位宣告子的成員
  • 遠程過程調用的參數

陣列中每個維度的界限會以個別的方括弧表示。 評估為 n 的運算式表示零的下限和 n - 1上限。 如果方括弧是空的,或包含單一星號 ,則下限為零,並在運行時間決定上限。

數位也可以包含兩個以省略號分隔的值,代表陣列的下限和上限,如 [lower...upper]。 Microsoft RPC 需要零的下限。 MIDL 編譯程式無法辨識指定非零下限的建構。

數位可以與欄位屬性size_is、max_is、length_is、first_islast_is相關聯,以指定數位的大小或包含有效數據的數位部分。 這些欄位屬性會識別指定數位維度或索引的參數、結構欄位或常數。

數位必須以下列方式與 field 屬性指定的標識符相關聯:當陣列是參數時,標識碼也必須是相同函式的參數;當陣列是結構欄位時,標識碼必須是該相同結構的另一個結構字段。

如果運行時間決定任何維度的上限,則陣列稱為「一致性」。 (運行時間只能決定上限。若要判斷上限,陣列宣告必須包含size_ismax_is屬性。

當陣列在編譯時期判斷其界限時稱為「不同」,但在運行時間決定傳輸的項目範圍。 若要判斷傳輸的專案範圍,陣列宣告必須包含 length_isfirst_islast_is 屬性。

一個符合性的不同陣列(也稱為“open”)是陣列,其上限和傳輸專案範圍是在運行時間決定的。 最多一個一個一致性或一致性不同的陣列可以巢狀在C結構中,而且必須是結構的最後一個專案。 相反地,結構中的任何位置都可能發生不一成不變的陣列。

範例

/* IDL file interface body */ 
#define MAX_INDEX 10 
 
typedef char  ATYPE[MAX_INDEX]; 
typedef short BTYPE[];        // Equivalent to [*]; 
typedef long  CTYPE[*][10];   // [][10] 
typedef float DTYPE[0..10];   // Equivalent to [11] 
typedef float ETYPE[0..(MAX_INDEX)];  
 
typedef struct 
{ 
    unsigned short size; 
    unsigned short length; 
    [size_is(size), length_is(length)] char string[*]; 
} counted_string; 
 
HRESULT MyFunction( 
     [in, out] short * pSize,  
     [in, out, string, size_is(*pSize)] char a[0..*] 
);

如需詳細資訊,請參閱 數位和指標

多維陣列

使用者可以宣告屬於數位的類型,然後宣告這類型別對象的陣列。 n 維度陣列類型的 m 維度數位語意與 m+n 維度陣列的語意相同。

例如,RECT_TYPE類型可以定義為二維陣列,而變數 rect 可以定義為RECT_TYPE的陣列。 這相當於三維陣列 equivalent_rect

typedef short int RECT_TYPE[10][20]; 
RECT_TYPE rect[15]; 
short int equivalent_rect[15][10][20];  // ~RECT_TYPE rect[15]

Microsoft RPC 是 C 導向的。 遵循 C 語言慣例,運行時間只能判斷多維度陣列的第一個維度。 與支援其他語言的 DCE IDL 陣組互操作僅限於:

  • 具有常數(編譯時間決定)界限的多維度陣列。
  • 除第一個維度以外,具有所有常數界限的多維度陣列。 第一個維度的傳輸元素上限和範圍取決於運行時間。
  • 具有零下限的任何一維陣列。

當多維度陣列上使用 [string] 屬性時,屬性會套用至最右邊的數位。

指標陣列

參考指標必須指向有效的數據。 用戶端應用程式必須配置參考指標之 [in][in,out] 陣列的所有記憶體,特別是當陣列與 [in]、[in]、[in]、[length_is][last_is] 值相關聯時。 用戶端應用程式也必須在呼叫之前初始化所有數位元素。 回到用戶端之前,伺服器應用程式必須確認傳輸範圍中的所有數位元素都指向有效的記憶體。

在伺服器端,存根會配置所有數位元素的記憶體,而不論呼叫時 [length_is][last_is] 值為何。 這項功能可能會影響應用程式的效能。

唯一指標的陣列不會有任何限制。 在客戶端和伺服器上,記憶體會配置給 Null 指標。 當指標不是 Null 時,數據會放在預先配置的記憶體中。

選擇性指標宣告子可以在陣列宣告子之前。

當內嵌參考指標是 [out]-only 參數時,伺服器管理員程式代碼必須將有效的值指派給參考指標數位列。 例如:

typedef [ref] short * ARefPointer;
typedef ARefPointer ArrayOfRef[10];
HRESULT proc1( [out] ArrayOfRef Parameter );

產生的存根會配置陣列,並將 Null 值指派給陣列中內嵌的所有指標。