буфер Application-Allocated
Атрибут ACF [byte_count] направляет заглушки на использование предварительно выделенного буфера, который не выделен или не освобожден подпрограммами поддержки клиента. Атрибут [byte_count] применяется к параметру указателя или массива, который указывает на буфер. Для этого требуется параметр , указывающий размер буфера в байтах.
Выделенная клиентом область памяти может содержать сложные структуры данных с несколькими указателями. Так как область памяти является непрерывной, приложению не нужно выполнять несколько вызовов, чтобы освободить каждый указатель и структуру по отдельности. Как и при использовании атрибута [allocate(all_nodes)], область памяти можно выделить или освободить с помощью одного вызова подпрограммы выделения памяти или свободной подпрограммы. Однако, в отличие от использования атрибута [allocate(all_nodes)], параметр buffer управляется не клиентской заглубой, а клиентским приложением.
Буфер должен быть параметром [out], а длина буфера в байтах должна быть параметром только [in]. Атрибут [byte_count] можно применять только к типам указателей. Атрибут ACF [byte_count] является расширением Майкрософт для DCE IDL и поэтому недоступен при компиляции с помощью параметра MIDL /osf .
В следующем примере параметр pRoot использует число байтов:
/* 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 */
);
Атрибут [byte_count] отображается в ACF следующим образом:
/* ACF file (fragment) */
SortNames([byte_count(cBytes)] pRoot);
Клиентская заглушка, созданная из этих файлов IDL и ACF, не выделяет и не освобождает память для этого буфера. Заглушка сервера выделяет и освобождает буфер в одном вызове с помощью предоставленного параметра size. Если данные слишком велики для указанного размера буфера, возникает исключение.