attributo byte_count
L'attributo [byte_count] ACF è un attributo di parametro che associa una dimensione, in byte, all'area di memoria indicata dal puntatore.
[ function-attribute-list ] function-name(
[byte_count(length-variable-name)] parameter-name);
...);
Parametri
-
function-attribute-list
-
Specifica zero o più attributi di funzione ACF.
-
nome funzione
-
Specifica il nome della funzione definita nel file IDL. Il nome della funzione è obbligatorio.
-
length-variable-name
-
Specifica il nome del parametro [in]-only che specifica le dimensioni, in byte, dell'area di memoria a cui fa riferimento il nome del parametro.
-
nome parametro
-
Specifica il nome del parametro puntatore [out]-only definito nel file IDL.
Commenti
L'attributo ACF [byte_count] rappresenta un'estensione Microsoft per DCE IDL. Pertanto, questo attributo non è disponibile quando si usa l'opzione del compilatore MIDL /osf.
Nota
L'attributo [byte count] non è più supportato nella sintassi NDR64 a causa della difficoltà nella stima delle dimensioni necessarie per tutti i parametri [out].
La memoria a cui fa riferimento il parametro puntatore è contigua e non viene allocata o liberata dagli stub client. Questa funzionalità dell'attributo [byte_count] consente di creare un'area buffer persistente nella memoria client che può essere riutilizzata durante più chiamate alla procedura remota.
La possibilità di disattivare l'allocazione della memoria stub client consente di ottimizzare l'applicazione per l'efficienza. Ad esempio, l'attributo [byte_count] può essere usato dalle funzioni del provider di servizi che usano Microsoft RPC. Quando un'applicazione utente chiama l'API del provider di servizi e invia un puntatore a un buffer, il provider di servizi può passare il puntatore del buffer alla funzione remota. Il provider di servizi può riutilizzare il buffer durante più chiamate remote senza forzare l'utente a riallocare l'area di memoria.
L'area di memoria può contenere strutture di dati complesse costituite da più puntatori. Poiché l'area di memoria è contigua, l'applicazione non deve effettuare diverse chiamate per liberare singolarmente ogni puntatore e struttura. Può invece allocare o liberare l'area di memoria con una chiamata all'allocazione di memoria o alla routine gratuita.
Il buffer deve essere un parametro [out]-only, mentre la lunghezza del buffer in byte deve essere un parametro [in]-only.
Specificare un buffer sufficiente per contenere tutti i parametri [out] . A causa della spaziatura nascosta, usare overestimates anziché conteggi esatto. Ad esempio, i puntatori a 4 byte non vengono separati da un limite allineato a 4 byte su piattaforme a 32 bit e puntatori a 8 byte su un limite a 8 byte su piattaforme a 64 bit. Pertanto, l'riempimento dell'allineamento degli stub deve essere tenuto conto nello spazio per il buffer. Inoltre, i livelli di imballaggio usati durante la compilazione in linguaggio C possono variare. Usare un valore di conteggio byte che consente di aggiungere byte aggiuntivi per il livello di imballaggio usato durante la compilazione in linguaggio C. Una pratica sicura che copre entrambe le piattaforme a 32 bit e a 64 bit consiste nel presupposto che ogni oggetto che entra nel blocco di memoria grande inizia a un indirizzo che è un multiplo di 8.
Esempi
/* IDL file */
HRESULT proc1([in] unsigned long length,
[out] struct my_struct * pMyStruct);
/* ACF file */
proc1([byte_count(length)] pMyStruct);
Vedere anche