length_is (attributo)
L'attributo [length_is] specifica il numero di elementi della matrice da trasmettere. È necessario specificare un valore non negativo.
[length_is( limited-expression-list )]
Parametri
-
elenco di espressioni limitate
-
Specifica una o più espressioni del linguaggio C. Ogni espressione restituisce un numero intero che rappresenta il numero di elementi della matrice da trasmettere. Il compilatore MIDL supporta espressioni condizionali, espressioni logiche, espressioni relazionali e espressioni aritmetiche. MIDL non consente chiamate di funzione nelle espressioni e non consente operatori di incremento e decremento. Separare più espressioni con virgole.
Commenti
L'attributo [length_is] determina il valore degli indici di matrice corrispondenti all'attributo [last_is] quando [last_is] non è specificato. La relazione tra questi indici di matrice è la seguente: length = last - first + 1.
L'attributo [length_is] non può essere usato contemporaneamente all'attributo [last_is] o all'attributo [stringa].
Per definire una stringa conteggiata con un attributo [length_is] o [last_is], usare una matrice di caratteri o un puntatore senza l'attributo [stringa].
L'uso di un'espressione costante con l'attributo [length_is] è un uso inappropriato dell'attributo. È legale, ma inefficiente e comporterà un marshalling più lento del codice.
È possibile usare gli attributi [size_is] e [length_is] insieme. Quando si esegue, l'attributo [size_is] controlla la quantità di memoria allocata per i dati. L'attributo [length_is] specifica il numero di elementi trasmessi. La quantità di memoria specificata dagli attributi [size_is] e [length_is] non devono essere uguali. Ad esempio, il client può passare un parametro [in, out] a un server e specificare un'allocazione di memoria di grandi dimensioni con [size_is], anche se specifica un numero ridotto di elementi di dati da passare con [length_is]. Ciò consente al server di riempire la matrice con più dati ricevuti, che può quindi inviare nuovamente al client.
In generale, non è utile specificare sia [size_is] sia [length_is] su [in] o [out] parametri. In entrambi i casi , [size_is] controlla l'allocazione della memoria. L'applicazione può usare [size_is] per allocare più elementi di matrice che trasmette (come specificato da [length_is]). Tuttavia, questo sarebbe inefficiente. Sarebbe inoltre inefficiente specificare valori identici per [size_is] e [length_is]. Poiché crea un sovraccarico aggiuntivo durante il marshalling dei parametri. Quando i valori di [size_is] e [length_is] sono sempre uguali, omettere l'attributo [length_is] .
Esempi
/* 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]);
Vedere anche