Condividi tramite


buffer Application-Allocated

L'attributo ACF [byte_count] indirizza gli stub per usare un buffer preallocato non allocato o liberato dalle routine di supporto client. L'attributo [byte_count] viene applicato a un puntatore o a un parametro di matrice che punta al buffer. Richiede un parametro che specifica le dimensioni del buffer in byte.

L'area di memoria allocata dal client può contenere strutture di dati complesse con più puntatori. Poiché l'area di memoria è contigua, l'applicazione non deve effettuare diverse chiamate per liberare ogni puntatore e struttura singolarmente. Come quando si usa l'attributo [allocate(all_nodes)], l'area di memoria può essere allocata o liberata con una chiamata alla routine di allocazione della memoria o alla routine gratuita. Tuttavia, a differenza dell'attributo [allocate(all_nodes)], il parametro buffer non è gestito dallo stub client ma dall'applicazione client.

Il buffer deve essere un parametro [out]-only e la lunghezza del buffer in byte deve essere un parametro [in]-only. L'attributo [byte_count] può essere applicato solo ai tipi di puntatore. L'attributo [byte_count] ACF è un'estensione Microsoft per DCE IDL e, di conseguenza, non è disponibile se si compila usando l'opzione MIDL /osf .

Nell'esempio seguente il parametro pRoot usa il conteggio byte:

/* function prototype in IDL file (fragment) */
void SortNames(
    [in] short cNames,
    [in, size_is(cNames)] STRINGTYPE pszArray[],
    [in] short cBytes,
    [out, ref] P_TREE_TYPE pRoot  /* tree with sorted data */
);

L'attributo [byte_count] viene visualizzato nell'ACF come:

/* ACF file (fragment) */
SortNames([byte_count(cBytes)] pRoot);

Lo stub client generato da questi file IDL e ACF non alloca o libera la memoria per questo buffer. Lo stub del server alloca e libera il buffer in una singola chiamata usando il parametro di dimensione specificato. Se i dati sono troppo grandi per le dimensioni del buffer specificate, viene generata un'eccezione.