Delen via


MIDL-matrices

Matrixdeclaraties worden weergegeven in de interfacetekst van het IDL-bestand als een van de volgende:

  • Onderdeel van een algemene verklaring
  • Een lid van een structuur- of samenvoegdeclarator
  • Een parameter voor een aanroep van een externe procedure

De grenzen van elke dimensie van de matrix worden uitgedrukt in een afzonderlijk paar vierkante haken. Een expressie die resulteert in n een ondergrens van nul en een bovengrens van n - 1aangeeft. Als de vierkante haken leeg zijn of één sterretje (*) bevatten, is de ondergrens nul en wordt de bovengrens tijdens runtime bepaald.

De matrix kan ook twee waarden bevatten, gescheiden door een beletselteken dat de onder- en bovengrenzen van de matrix vertegenwoordigt, zoals in [onderste...bovenste]. Microsoft RPC vereist een ondergrens van nul. De MIDL-compiler herkent geen constructies die niet-nulondergrenzen opgeven.

Matrices kunnen worden gekoppeld aan de veldkenmerken size_is, max_is, length_is, first_isen last_is om de grootte van de matrix of het deel van de matrix met geldige gegevens op te geven. Deze veldkenmerken identificeren de parameter, het structuurveld of de constante die de matrixdimensie of index specificeert.

De matrix moet op de volgende manier worden gekoppeld aan de id die is opgegeven door het veldkenmerk: Wanneer de matrix een parameter is, moet de id ook een parameter voor dezelfde functie zijn; wanneer de matrix een structuurveld is, moet de id een ander structuurveld van dezelfde structuur zijn.

Een matrix wordt 'conformant' genoemd als de bovengrens van een dimensie tijdens runtime wordt bepaald. (Alleen bovengrenzen kunnen tijdens runtime worden bepaald.) Als u de bovengrens wilt bepalen, moet de matrixdeclaratie een size_is of max_is kenmerk bevatten.

Een matrix wordt 'variërend' genoemd wanneer de grenzen tijdens het compileren worden bepaald, maar het bereik van verzonden elementen wordt tijdens runtime bepaald. Om het bereik van verzonden elementen te bepalen, moet de matrixdeclaratie een length_is, first_isof last_is kenmerk bevatten.

Een conforme wisselende matrix (ook wel 'open' genoemd) is een matrix waarvan de bovengrens en het bereik van verzonden elementen tijdens runtime worden bepaald. Maximaal één conforme of conforme verschillende matrix kan worden genest in een C-structuur en moet het laatste element van de structuur zijn. Daarentegen kunnen niet-conforme verschillende matrices overal in een structuur voorkomen.

Voorbeelden

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

Zie matrices en aanwijzersvoor meer informatie.

Multidimensionale matrices

De gebruiker kan typen declareren die matrices zijn en vervolgens matrices van objecten van dergelijke typen declareren. De semantiek van m-dimensionale matrices van n-dimensionale matrixtypen zijn hetzelfde als de semantiek van m+n-dimensionale matrices.

Het type RECT_TYPE kan bijvoorbeeld worden gedefinieerd als een tweedimensionale matrix en de variabele kan worden gedefinieerd als een matrix van RECT_TYPE. Dit komt overeen met de driedimensionale matrix 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 is C-georiënteerd. Na C-taalconventies kan alleen de eerste dimensie van een multidimensionale matrix tijdens runtime worden bepaald. Interoperation with DCE IDL arrays that support other languages is limited to:

  • Multidimensionale matrices met constante (gecompileerd tijdsgebonden) grenzen.
  • Multidimensionale matrices met alle constante grenzen behalve de eerste dimensie. De bovengrens en het bereik van verzonden elementen van de eerste dimensie zijn afhankelijk van runtime.
  • Eendimensionale matrices met een ondergrens van nul.

Wanneer de [tekenreeks] wordt gebruikt kenmerk wordt gebruikt voor multidimensionale matrices, is het kenmerk van toepassing op de meest rechtse matrix.

Matrices met aanwijzers

Verwijzingspunten moeten verwijzen naar geldige gegevens. De clienttoepassing moet alle geheugen toewijzen voor een [in] of [in,] matrix met verwijzingspunten, met name wanneer de matrix is gekoppeld aan [in]of [in,out], [length_is], of [last_is] waarden. De clienttoepassing moet ook alle matrixelementen initialiseren vóór de aanroep. Voordat u terugkeert naar de client, moet de servertoepassing controleren of alle matrixelementen in het verzonden bereik verwijzen naar geldige opslag.

Aan de serverzijde wijst de stub opslag toe voor alle matrixelementen, ongeacht de [length_is] of [last_is] waarde op het moment van de aanroep. Deze functie kan van invloed zijn op de prestaties van uw toepassing.

Er worden geen beperkingen ingesteld voor matrices met unieke aanwijzers. Op zowel de client als de server wordt opslag toegewezen voor null-aanwijzers. Wanneer aanwijzers niet null zijn, worden gegevens in vooraf toegewezen opslag geplaatst.

Een optionele aanwijzerdeclaratie kan voorafgaan aan de matrixdeclaratie.

Wanneer ingesloten verwijzingspunten worden [uit]-only parameters, moet de serverbeheercode geldige waarden toewijzen aan de matrix met verwijzingspunten. Bijvoorbeeld:

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

De gegenereerde stubs wijzen de matrix toe en wijzen null-waarden toe aan alle aanwijzers die zijn ingesloten in de matrix.