Atributo length_is
O atributo [length_is] especifica o número de elementos de matriz a serem transmitidos. Você deve especificar um valor não negativo.
[length_is( limited-expression-list )]
Parâmetros
-
limited-expression-list
-
Especifica uma ou mais expressões de linguagem C. Cada expressão é avaliada como um inteiro que representa o número de elementos de matriz a serem transmitidos. O compilador MIDL dá suporte a expressões condicionais, expressões lógicas, expressões relacionais e expressões aritméticas. MIDL não permite invocações de função em expressões e não permite operadores de incremento e decremento. Separe várias expressões com vírgulas.
Comentários
O atributo [length_is] determina o valor dos índices de matriz correspondentes ao atributo [last_is] quando [last_is] não é especificado. A relação entre esses índices de matriz é a seguinte: length = last - first + 1.
O atributo [length_is] não pode ser usado ao mesmo tempo que o atributo [last_is] ou o atributo [string] .
Para definir uma cadeia de caracteres contada com um atributo [length_is] ou [last_is] , use uma matriz de caracteres ou um ponteiro sem o atributo [string] .
Usar uma expressão constante com o atributo [length_is] é um uso inadequado do atributo. É legal, mas ineficiente e resultará em um código de marshaling mais lento.
Você pode usar os atributos [size_is] e [length_is] juntos. Quando você faz isso, o atributo [size_is] controla a quantidade de memória alocada para os dados. O atributo [length_is] especifica quantos elementos são transmitidos. A quantidade de memória especificada pelos atributos [size_is] e [length_is] não precisa ser a mesma. Por exemplo, seu cliente pode passar um parâmetro [in, out] para um servidor e especificar uma alocação de memória grande com [size_is], mesmo que ele especifique um pequeno número de elementos de dados a serem passados com [length_is]. Isso permite que o servidor preencha a matriz com mais dados do que recebeu, que ele pode enviar de volta para o cliente.
Em geral, não é útil especificar parâmetros [size_is] e [length_is] em parâmetros [in] ou [out] . Em ambos os casos, [size_is] controla a alocação de memória. Seu aplicativo pode usar [size_is] para alocar mais elementos de matriz do que transmite (conforme especificado por [length_is]). No entanto, isso seria ineficiente. Também seria ineficiente especificar valores idênticos para [size_is] e [length_is]. Porque isso criaria uma sobrecarga extra durante o marshaling de parâmetros. Quando os valores de [size_is] e [length_is] são sempre os mesmos, omita o atributo [length_is] .
Exemplos
/* 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]);
Confira também