Bagikan melalui


Array MIDL

Deklarator array muncul di isi antarmuka file IDL sebagai salah satu hal berikut:

  • Bagian dari deklarasi umum
  • Anggota struktur atau deklarator serikat
  • Parameter ke panggilan prosedur jarak jauh

Batas setiap dimensi array diekspresikan di dalam sepasang kurung siku yang terpisah. Ekspresi yang mengevaluasi ke n menandakan batas nol yang lebih rendah dan batas atas n - 1. Jika tanda kurung siku kosong atau berisi tanda bintang tunggal (*), batas bawah adalah nol dan batas atas ditentukan pada runtime.

Array juga dapat berisi dua nilai yang dipisahkan oleh elipsis yang mewakili batas bawah dan atas array, seperti pada [lower...atas]. Microsoft RPC memerlukan batas nol yang lebih rendah. Pengkompilasi MIDL tidak mengenali konstruksi yang menentukan batas bawah nonzero.

Array dapat dikaitkan dengan atribut bidang size_is, max_is, length_is, first_is, dan last_is untuk menentukan ukuran array atau bagian array yang berisi data yang valid. Atribut bidang ini mengidentifikasi parameter, bidang struktur, atau konstanta yang menentukan dimensi atau indeks array.

Array harus dikaitkan dengan pengidentifikasi yang ditentukan oleh atribut bidang dengan cara berikut: Ketika array adalah parameter, pengidentifikasi juga harus menjadi parameter ke fungsi yang sama; ketika array adalah bidang struktur, pengidentifikasi harus merupakan bidang struktur lain dari struktur yang sama.

Array disebut "sesuai" jika batas atas dimensi apa pun ditentukan pada runtime. (Hanya batas atas yang dapat ditentukan pada runtime.) Untuk menentukan batas atas, deklarasi array harus menyertakan atribut size_is atau max_is.

Array disebut "bervariasi" ketika batasnya ditentukan pada waktu kompilasi, tetapi rentang elemen yang ditransmisikan ditentukan pada runtime. Untuk menentukan rentang elemen yang ditransmisikan, deklarasi array harus menyertakan atribut length_is, first_is, atau last_is.

Array variasi yang sesuai (juga disebut "terbuka") adalah array yang batas atas dan rentang elemen yang ditransmisikan ditentukan pada runtime. Paling banyak, satu array variasi yang sesuai atau sesuai dapat ditumpuk dalam struktur C dan harus menjadi elemen terakhir dari struktur. Sebaliknya, array yang bervariasi tidak konforman dapat terjadi di mana saja dalam struktur.

Contoh

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

Untuk informasi selengkapnya, lihat Array dan Pointer.

Array Multidimensi

Pengguna dapat mendeklarasikan jenis yang merupakan array lalu mendeklarasikan array objek dari jenis tersebut. Semantik array m-dimensi dari jenis array n-dimensi sama dengan semantik array m+n-dimensi.

Misalnya, jenis RECT_TYPE dapat didefinisikan sebagai array dua dimensi dan rect variabel dapat didefinisikan sebagai array RECT_TYPE. Ini setara dengan array tiga dimensi 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 berorientasi C. Mengikuti konvensi bahasa C, hanya dimensi pertama dari array multidimensi yang dapat ditentukan pada runtime. Interoperatasi dengan array IDL DCE yang mendukung bahasa lain terbatas pada:

  • Array multidimensi dengan batas konstanta (ditentukan waktu kompilasi).
  • Array multidireksional dengan semua batas konstanta kecuali dimensi pertama. Batas atas dan rentang elemen yang ditransmisikan dari dimensi pertama tergantung pada runtime.
  • Array satu dimensi apa pun dengan batas nol yang lebih rendah.

Ketika atribut [string] digunakan pada array multidimensi, atribut berlaku untuk array paling kanan.

Array Pointer

Penunjuk referensi harus menunjuk ke data yang valid. Aplikasi klien harus mengalokasikan semua memori untuk array pointer referensi [in] atau [ in,out], terutama ketika array dikaitkan dengan nilai [in], atau [ in,out], [length_is], atau [last_is]. Aplikasi klien juga harus menginisialisasi semua elemen array sebelum panggilan. Sebelum kembali ke klien, aplikasi server harus memverifikasi bahwa semua elemen array dalam titik rentang yang dikirimkan ke penyimpanan yang valid.

Di sisi server, stub mengalokasikan penyimpanan untuk semua elemen array, terlepas dari nilai [length_is] atau [last_is] pada saat panggilan. Fitur ini dapat memengaruhi performa aplikasi Anda.

Tidak ada batasan yang ditempatkan pada array pointer unik. Pada klien dan server, penyimpanan dialokasikan untuk pointer null. Saat pointer tidak null, data ditempatkan di penyimpanan yang telah dialokasikan sebelumnya.

Deklarator penunjuk opsional dapat mendahului deklarator array.

Ketika penunjuk referensi yang disematkan adalah parameter [out]-only, kode server-manager harus menetapkan nilai yang valid ke array penunjuk referensi. Contohnya:

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

Stub yang dihasilkan mengalokasikan array dan menetapkan nilai null ke semua pointer yang disematkan dalam array.