Buffer Application-Allocated
O atributo ACF [byte_count] direciona os stubs para usar um buffer pré-alocado que não é alocado ou liberado pelas rotinas de suporte do cliente. O atributo [byte_count] é aplicado a um ponteiro ou parâmetro de matriz que aponta para o buffer. Ele requer um parâmetro que especifica o tamanho do buffer em bytes.
A área de memória alocada pelo cliente pode conter estruturas de dados complexas com vários ponteiros. Como a área de memória é contígua, o aplicativo não precisa fazer várias chamadas para liberar cada ponteiro e estrutura individualmente. Como ao usar o atributo [allocate(all_nodes)], a área de memória pode ser alocada ou liberada com uma chamada para a rotina de alocação de memória ou a rotina livre. No entanto, ao contrário de usar o atributo [allocate(all_nodes)], o parâmetro de buffer não é gerenciado pelo stub do cliente, mas pelo aplicativo cliente.
O buffer deve ser um parâmetro [out]-only e o comprimento do buffer em bytes deve ser um parâmetro [in]-only. O atributo [byte_count] só pode ser aplicado a tipos de ponteiro. O atributo ACF [byte_count] é uma extensão da Microsoft para IDL de DCE e, como tal, não estará disponível se você compilar usando a opção MIDL /osf .
No exemplo a seguir, o parâmetro pRoot usa a contagem de bytes:
/* 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 */
);
O atributo [byte_count] aparece no ACF como:
/* ACF file (fragment) */
SortNames([byte_count(cBytes)] pRoot);
O stub do cliente gerado com base nesses arquivos IDL e ACF não aloca nem libera a memória para esse buffer. O stub do servidor aloca e libera o buffer em uma única chamada usando o parâmetro de tamanho fornecido. Se os dados forem muito grandes para o tamanho do buffer especificado, uma exceção será gerada.