Поделиться через


буфер 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. Если данные слишком велики для указанного размера буфера, возникает исключение.