Sdílet prostřednictvím


Pole MIDL

Deklarátory pole se zobrazují v těle rozhraní souboru IDL jako jeden z následujících:

  • Část obecné deklarace
  • Člen deklarátoru struktury nebo sjednocení
  • Parametr vzdáleného volání procedury

Hranice každé dimenze pole jsou vyjádřeny uvnitř samostatné dvojice hranatých závorek. Výraz, který se vyhodnotí jako n označuje dolní mez nuly a horní mez n - 1. Pokud jsou hranaté závorky prázdné nebo obsahují jednu hvězdičku (*), dolní mez je nula a horní mez je určena za běhu.

Matice může obsahovat také dvě hodnoty oddělené třemi tečkami, které představují dolní a horní mez matice, stejně jako v [dolní...horní]. Microsoft RPC vyžaduje dolní mez nuly. Kompilátor MIDL nerozpozná konstrukty, které určují nenulové dolní hranice.

Pole mohou být přidružena k atributům pole size_is, max_is, length_is, first_isa last_is určit velikost pole nebo část pole, která obsahuje platná data. Tyto atributy pole identifikují parametr, pole struktury nebo konstantu, která určuje dimenzi pole nebo index.

Pole musí být přidruženo k identifikátoru určenému atributem pole následujícím způsobem: Pokud je pole parametrem, musí být identifikátor také parametrem stejné funkce; pokud je polem struktury pole, musí být identifikátor dalším polem struktury stejné struktury.

Pole se nazývá "shoda", pokud je horní mez jakékoli dimenze určena za běhu. (Za běhu lze určit pouze horní mez.) Chcete-li určit horní mez, musí deklarace pole obsahovat size_is nebo max_is atribut.

Pole se nazývá "varying", když jsou jeho hranice určeny v době kompilace, ale rozsah přenášených prvků je určen za běhu. Chcete-li určit rozsah přenášených prvků, musí deklarace pole obsahovat length_is, first_isnebo last_is atribut.

Odpovídající matice (označovaná také jako "open") je matice, jejíž horní mez a rozsah přenášených prvků jsou určeny za běhu. Ve struktuře jazyka C lze vnořit maximálně jedno vyhovující nebo vyhovující pole, které musí být posledním prvkem struktury. Naproti tomu nekonformantní různá pole mohou nastat kdekoli ve struktuře.

Příklady

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

Další informace naleznete v tématu matice a ukazatele.

Multidimenzionální pole

Uživatel může deklarovat typy, které jsou pole a potom deklarovat pole objektů těchto typů. Sémantika m-dimenzionální pole n-dimenzionálních polí jsou stejná jako sémantika m+n-dimenzionální pole.

Typ RECT_TYPE lze například definovat jako dvojrozměrné pole a proměnnou lze definovat jako pole RECT_TYPE. To odpovídá trojrozměrné matici 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 je orientovaný na jazyk C. Podle konvencí jazyka C lze za běhu určit pouze první dimenzi multidimenzionálního pole. Spolupráce s poli IDL DCE, která podporují jiné jazyky, je omezená na:

  • Multidimenzionální pole s konstantními hranicemi (určenými časem kompilace).
  • Multidimenzionální pole se všemi hranicemi konstant s výjimkou první dimenze. Horní mez a rozsah přenášených prvků první dimenze jsou závislé na modulu runtime.
  • Všechna jednorozměrná pole s dolní mezí nuly.

Při použití atributu [řetězec] u multidimenzionálních polí se atribut vztahuje na pole nejvíce vpravo.

Pole ukazatelů

Odkazové ukazatele musí odkazovat na platná data. Klientská aplikace musí přidělit veškerou paměť pro [v] nebo [v,] matice referenčních ukazatelů, zejména pokud je matice přidružena [in], nebo [in,out], [length_is], nebo [last_is] hodnoty. Klientská aplikace musí také inicializovat všechny prvky pole před voláním. Před návratem do klienta musí serverová aplikace ověřit, zda všechny prvky pole v přenášené oblasti odkazují na platné úložiště.

Na straně serveru zástupný procedura přidělí úložiště pro všechny prvky pole bez ohledu na [length_is] nebo [last_is] hodnotu v době volání. Tato funkce může ovlivnit výkon vaší aplikace.

Na pole jedinečných ukazatelů se neukládají žádná omezení. Na klientovi i na serveru je úložiště přiděleno pro ukazatele null. Pokud jsou ukazatele nenulové, data se umístí do předlokovaného úložiště.

Volitelný deklarátor ukazatele může předcházet deklarátoru pole.

Pokud jsou vložené referenční ukazatele [ven]-only parametry, musí kód správce serveru přiřadit platné hodnoty k poli referenčních ukazatelů. Například:

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

Generované zástupné procedury přidělují matici a přiřazují hodnoty null všem ukazatelům vloženým do pole.