length_is (atributo)
El atributo [length_is] especifica el número de elementos de matriz que se van a transmitir. Debe especificar un valor no negativo.
[length_is( limited-expression-list )]
-
limited-expression-list
-
Especifica una o varias expresiones de lenguaje C. Cada expresión se evalúa como un entero que representa el número de elementos de matriz que se van a transmitir. El compilador MIDL admite expresiones condicionales, expresiones lógicas, expresiones relacionales y expresiones aritméticas. MIDL no permite invocaciones de función en expresiones y no permite operadores de incremento y decremento. Separe varias expresiones con comas.
El atributo [length_is] determina el valor de los índices de matriz correspondientes al atributo [last_is] cuando no se especifica [last_is]. La relación entre estos índices de matriz es la siguiente: length = last - first + 1.
El atributo [length_is] no se puede usar al mismo tiempo que el atributo [last_is] o el atributo [string].
Para definir una cadena contada con un atributo [length_is] o [last_is], use una matriz de caracteres o un puntero sin el atributo [string].
El uso de una expresión constante con el atributo [length_is] es un uso inadecuado del atributo. Es legal, pero ineficaz, y dará como resultado una serialización más lenta del código.
Puede usar los atributos [size_is] y [length_is] juntos. Al hacerlo, el atributo [size_is] controla la cantidad de memoria asignada para los datos. El atributo [length_is] especifica cuántos elementos se transmiten. La cantidad de memoria especificada por los atributos [size_is] y [length_is] no deben ser iguales. Por ejemplo, el cliente puede pasar un parámetro [in, out] a un servidor y especificar una asignación de memoria grande con [size_is], aunque especifique un pequeño número de elementos de datos que se van a pasar con [length_is]. Esto permite al servidor rellenar la matriz con más datos de los que recibió, que luego puede devolver al cliente.
En general, no es útil especificar los parámetros [size_is] y [length_is] en los parámetros [in] o [out]. En ambos casos, [size_is] controla la asignación de memoria. La aplicación podría usar [size_is] para asignar más elementos de matriz de los que transmite (según lo especificado por [length_is]). Sin embargo, esto sería ineficaz. También sería ineficaz especificar valores idénticos para [size_is] y [length_is]. Dado que crearía una sobrecarga adicional durante la serialización de parámetros. Cuando los valores de [size_is] y [length_is] siempre son los mismos, omita el atributo [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]);