Tableaux MIDL
Les déclarants de tableaux apparaissent dans le corps de l'interface du fichier IDL sous l'une des formes suivantes :
- Partie d'une déclaration générale
- membre d'un déclarateur de structure ou d'union
- un paramètre d'un appel de procédure à distance.
Les limites de chaque dimension du tableau sont exprimées à l'intérieur d'une appairage séparée de crochets. Une expression évaluée à n signifie une borne inférieure de zéro et une borne supérieure de n - 1. Si les crochets sont vides ou contiennent un astérisque (*), la borne inférieure est zéro et la borne supérieure est déterminée au moment de l'exécution.
Le tableau peut également contenir deux valeurs séparées par un point de suspension qui représentent les limites inférieure et supérieure du tableau, comme dans [lower...upper]. Microsoft RPC exige une borne inférieure de zéro. Le compilateur MIDL ne reconnaît pas les constructions qui spécifient des bornes inférieures non nulles.
Les tableaux peuvent être associés aux attributs de champ size_is, max_is, length_is, first_is et last_is pour spécifier la taille du tableau ou la partie du tableau qui contient des données valides. Ces attributs de champ identifient le paramètre, le champ de structure ou la constante qui spécifie la dimension ou l'index du tableau.
Le tableau doit être associé à l'identificateur spécifié par l'attribut de champ de la manière suivante : Lorsque le tableau est un paramètre, l'identificateur doit également être un paramètre de la même fonction ; lorsque le tableau est un champ de structure, l'identificateur doit être un autre champ de structure de cette même structure.
Un tableau est dit "conforme" si la borne supérieure d'une dimension est déterminée au moment de l'exécution. (Pour déterminer la limite supérieure, la déclaration du tableau doit inclure un attribut size_is ou max_is.
Un tableau est dit "variable" lorsque ses limites sont déterminées à la compilation, mais que la plage des éléments transmis est déterminée à l'exécution. Pour déterminer la plage des éléments transmis, la déclaration du tableau doit inclure un attribut length_is, first_is ou last_is.
Un tableau variable conforme (également appelé "ouvert") est un tableau dont la borne supérieure et l'intervalle des éléments transmis sont déterminés au moment de l'exécution. Au maximum, un tableau conforme ou variable conforme peut être imbriqué dans une structure C et doit être le dernier élément de la structure. En revanche, les tableaux variables non conformes peuvent se trouver n'importe où dans une structure.
Exemples
/* 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..*]
);
Pour plus d'informations, voir Tableaux et indicateurs.
Tableaux multidimensionnels
L'utilisateur peut déclarer des types qui sont des tableaux et ensuite déclarer des tableaux d'objets de ces types. La sémantique des tableaux m-dimensionnels de types de tableaux n-dimensionnels est la même que la sémantique des tableaux m+n-dimensionnels.
Par exemple, le type RECT_TYPE peut être défini comme un tableau à deux dimensions et la variable rect peut être définie comme un tableau de RECT_TYPE. Cela équivaut au tableau tridimensionnel 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 est orienté C. Conformément aux conventions du langage C, seule la première dimension d'un tableau multidimensionnel peut être déterminée au moment de l'exécution. L'interopérabilité avec les tableaux DCE IDL qui prennent en charge d'autres langages est limitée :
- Les tableaux multidimensionnels avec des limites constantes (déterminées au moment de la compilation).
- Tableaux multidimensionnels avec toutes les bornes constantes sauf la première dimension. La limite supérieure et la plage des éléments transmis de la première dimension dépendent de la durée d'exécution.
- Tous les tableaux unidimensionnels dont la borne inférieure est égale à zéro.
Lorsque l'attribut [string] est utilisé sur des tableaux multidimensionnels, l'attribut s'applique au tableau le plus à droite.
Tableaux de pointeurs
Les pointeurs de référence doivent pointer vers des données valides. L'application cliente doit allouer toute la mémoire pour un [in] ou [in,out>]tableau de pointeurs de référence, notamment lorsque le tableau est associé à des valeurs [in], ou [ in,out], [length_is], ou [last_is]. L'application cliente doit également initialiser tous les éléments du tableau avant l'appel. Avant de retourner au client, l'application serveur doit vérifier que tous les éléments du tableau dans la plage transmise pointent vers des données valides.
Côté serveur, le stub alloue de l'espace de stockage pour tous les éléments du tableau, quelle que soit la valeur [length_is] ou [last_is] au moment de l'appel. Cette fonctionnalité peut affecter les performances de votre application.
Aucune restriction n'est imposée aux tableaux de pointeurs uniques. Tant sur le client que sur le serveur, un espace de stockage est alloué aux pointeurs nuls. Lorsque les pointeurs ne sont pas nuls, les données sont placées dans un espace de stockage pré-alloué.
Un déclarateur de pointeur optionnel peut précéder le déclarateur de tableau.
Lorsque les pointeurs de référence intégrés sont des paramètres[out] uniquement, le code du gestionnaire de serveur doit attribuer des valeurs valides au tableau de pointeurs de référence. Par exemple :
typedef [ref] short * ARefPointer;
typedef ARefPointer ArrayOfRef[10];
HRESULT proc1( [out] ArrayOfRef Parameter );
Les stubs générés allouent le tableau et attribuent des valeurs nulles à tous les pointeurs intégrés dans le tableau.