length_is (attribut)
L’attribut [length_is] spécifie le nombre d’éléments de tableau à transmettre. Vous devez spécifier une valeur non négative.
[length_is( limited-expression-list )]
-
limited-expression-list
-
Spécifie une ou plusieurs expressions en langage C. Chaque expression correspond à un entier qui représente le nombre d’éléments de tableau à transmettre. Le compilateur MIDL prend en charge les expressions conditionnelles, les expressions logiques, les expressions relationnelles et les expressions arithmétiques. MIDL n’autorise pas les appels de fonction dans les expressions et n’autorise pas les opérateurs d’incrémentation et de décrémentation. Séparez plusieurs expressions par des virgules.
L’attribut [length_is] détermine la valeur des index tableaux correspondant à l’attribut [last_is] lorsque [last_is] n’est pas spécifié. La relation entre ces index de tableau est la suivante : length = last - first + 1.
L’attribut [length_is] ne peut pas être utilisé en même temps que l’attribut [last_is] ou l’attribut [string].
Pour définir une chaîne comptée avec un attribut [length_is] ou [last_is], utilisez un tableau de caractères ou un pointeur sans l’attribut[string].
L’utilisation d’une expression constante avec l’attribut [length_is] est une utilisation inappropriée de l’attribut. Il est légal, mais inefficace, et entraînera un marshaling plus lent.
Vous pouvez utiliser les attributs [size_is] et [length_is] ensemble. Dans ce cas, l’attribut [size_is] contrôle la quantité de mémoire allouée pour les données. L’attribut [length_is] spécifie le nombre d’éléments transmis. La quantité de mémoire spécifiée par les attributs [size_is] et [length_is] ne doit pas être identique. Par instance, votre client peut passer un paramètre [in, out] à un serveur et spécifier une allocation de mémoire importante avec [size_is], même s’il spécifie un petit nombre d’éléments de données à passer avec [length_is]. Cela permet au serveur de remplir le tableau avec plus de données qu’il n’en a reçues, qu’il peut ensuite renvoyer au client.
En général, il n’est pas utile de spécifier à la fois [size_is] et [length_is] sur les paramètres [in] ou [out]. Dans les deux cas, [size_is] contrôle l’allocation de mémoire. Votre application peut utiliser [size_is] pour allouer plus d’éléments de tableau qu’elle ne transmet (comme spécifié par [length_is]). Toutefois, cela serait inefficace. Il serait également inefficace de spécifier des valeurs identiques pour [size_is] et [length_is] . Parce qu’il créerait une surcharge supplémentaire pendant le marshaling des paramètres. Lorsque les valeurs de [size_is] et [length_is] sont toujours les mêmes, omettez l’attribut [length_is].
/* counted string holding at most "size" characters */
typedef struct
{
unsigned short size;
unsigned short length;
[size_is(size), length_is(length)] char string[*];
} COUNTED_STRING_TYPE;
/* counted string holding at most 80 characters */
typedef struct
{
unsigned short length;
[length_is(length)] char string[80];
} STATIC_COUNTED_STRING_TYPE;
HRESULT Proc1(
[in] short iLength;
[in, length_is(iLength)] short asNumbers[10]);