Condividi tramite


buffer Application-Allocated

L'attributo ACF [byte_count] indirizza gli stub a usare un buffer preallocato che non viene 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 libera. Tuttavia, a differenza dell'uso dell'attributo [allocate(all_nodes)] , il parametro buffer non viene gestito dallo stub del 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 esegue la compilazione usando l'opzione MIDL /osf.

Nell'esempio seguente il parametro pRoot usa il conteggio dei 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 in ACF come segue:

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

Lo stub del 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 size fornito. Se i dati sono troppo grandi per le dimensioni del buffer specificate, viene generata un'eccezione.