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


буфер Application-Allocated

Атрибут ACF [byte_count] направляет заглушки на использование предварительно выделенного буфера, который не выделяется или освобождается подпрограммами поддержки клиентов. Атрибут [byte_count] применяется к параметру указателя или массива, который указывает на буфер. Для этого требуется параметр, указывающий размер буфера в байтах.

Выделенная клиентом область памяти может содержать сложные структуры данных с несколькими указателями. Так как область памяти является непрерывной, приложению не нужно выполнять несколько вызовов для освобождения каждого указателя и структуры по отдельности. Как и при использовании атрибута [выделения (all_nodes) ] область памяти можно выделить или освободить с помощью одного вызова подпрограммы выделения памяти или бесплатной подпрограммы. Однако в отличие от использования атрибута [allocate(all_nodes) ] буферный параметр не управляется заглушку клиента, но клиентским приложением.

Буфер должен быть параметром [вне]-only, а длина буфера в байтах должна быть [в]-only параметр. Атрибут [byte_count] можно применять только к типам указателей. Атрибут ACF [byte_count] является расширением Майкрософт для IDL DCE и, как это, недоступно, если вы компилируете с помощью переключателя 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, не выделяет или освобождает память для этого буфера. Заглушка сервера выделяет и освобождает буфер в одном вызове с помощью предоставленного параметра размера. Если данные слишком большие для указанного размера буфера, возникает исключение.