Compartilhar via


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.