MIDL-matriser
Matrisdeklaratorer visas i gränssnittstexten i IDL-filen som något av följande:
- En del av en allmän förklaring
- En medlem i en struktur- eller fackföreningsdeklarator
- En parameter till ett fjärrproceduranrop
Gränserna för varje dimension i matrisen uttrycks inom ett separat par hakparenteser. Ett uttryck som utvärderas till n innebär en lägre gräns på noll och en övre gräns på n – 1. Om hakparenteserna är tomma eller innehåller en enda asterisk (*) är den nedre gränsen noll och den övre gränsen bestäms vid körning.
Matrisen kan också innehålla två värden avgränsade med en ellips som representerar matrisens nedre och övre gränser, som i [lägre...övre]. Microsoft RPC kräver en lägre gräns på noll. MIDL-kompilatorn känner inte igen konstruktioner som anger icke-lägre gränser.
Matriser kan associeras med fältattributen size_is, max_is, length_is, first_isoch last_is för att ange matrisens storlek eller den del av matrisen som innehåller giltiga data. Dessa fältattribut identifierar parametern, strukturfältet eller konstanten som anger matrisdimensionen eller indexet.
Matrisen måste associeras med identifieraren som anges av fältattributet på följande sätt: När matrisen är en parameter måste identifieraren också vara en parameter för samma funktion. När matrisen är ett strukturfält måste identifieraren vara ett annat strukturfält i samma struktur.
En matris kallas "konform" om den övre gränsen för någon dimension bestäms vid körning. (Endast övre gränser kan fastställas vid körning.) För att fastställa den övre gränsen måste matrisdeklarationen innehålla ett size_is- eller max_is-attribut.
En matris kallas "varierande" när dess gränser bestäms vid kompileringstillfället, men intervallet för överförda element bestäms vid körning. För att fastställa intervallet för överförda element måste matrisdeklarationen innehålla ett length_is, first_iseller last_is attribut.
En överensstämmande varierande matris (kallas även "öppen") är en matris vars övre gräns och intervall av överförda element bestäms vid körning. Som mest kan en överensstämmande eller överensstämmande varierande matris kapslas i en C-struktur och måste vara det sista elementet i strukturen. Däremot kan icke-konforma varierande matriser förekomma var som helst i en struktur.
Exempel
/* 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..*]
);
Mer information finns i matriser och pekare.
Flerdimensionella matriser
Användaren kan deklarera typer som är matriser och sedan deklarera matriser med objekt av sådana typer. Semantiken för m-dimensionella matriser av n-dimensionella matristyper är samma som semantiken för m+n-dimensionella matriser.
Typen RECT_TYPE kan till exempel definieras som en tvådimensionell matris och variabeln rect kan definieras som en matris med RECT_TYPE. Detta motsvarar den tredimensionella matrisen 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 är C-orienterad. Enligt C-språkkonventioner kan endast den första dimensionen av en flerdimensionell matris fastställas vid körning. Samverkan med DCE IDL-matriser som stöder andra språk är begränsad till:
- Flerdimensionella matriser med konstanta gränser (kompilera tidsbestämt).
- Flerdimensionella matriser med alla konstanta gränser förutom den första dimensionen. Den övre gränsen och intervallet för de överförda elementen i den första dimensionen är beroende av körning.
- Alla endimensionella matriser med en lägre gräns på noll.
När attributet [string] ] används på flerdimensionella matriser gäller attributet för matrisen längst till höger.
Matriser med pekare
Referenspekare måste peka på giltiga data. Klientprogrammet måste allokera allt minne för en [i] eller [i,] matris med referenspekare, särskilt när matrisen är associerad med [in], eller [in,ut], [length_is], eller [last_is] värden. Klientprogrammet måste också initiera alla matriselement före anropet. Innan du återgår till klienten måste serverprogrammet kontrollera att alla matriselement i den överförda intervallpunkten till giltig lagring.
På serversidan allokerar stub-värdet lagring för alla matriselement, oavsett [length_is] eller [last_is] värde vid tidpunkten för anropet. Den här funktionen kan påverka programmets prestanda.
Det finns inga begränsningar för matriser med unika pekare. På både klienten och servern allokeras lagring för null-pekare. När pekare inte är null placeras data i förallokerad lagring.
En valfri pekardeklarator kan föregå matrisdeklaratorn.
När inbäddade referenspekare [ut]-only-parametrar måste serverhanterarens kod tilldela giltiga värden till matrisen med referenspekare. Till exempel:
typedef [ref] short * ARefPointer;
typedef ARefPointer ArrayOfRef[10];
HRESULT proc1( [out] ArrayOfRef Parameter );
De genererade måtten allokerar matrisen och tilldelar null-värden till alla pekare som är inbäddade i matrisen.