атрибут byte_count
Атрибут ACF [byte_count] — это атрибут параметра, который связывает размер в байтах с областью памяти, указанной указателем.
[ function-attribute-list ] function-name(
[byte_count(length-variable-name)] parameter-name);
...);
Параметры
-
function-attribute-list
-
Задает ноль или более атрибутов функции ACF.
-
имя функции
-
Указывает имя функции, определенной в IDL-файле. Имя функции является обязательным.
-
length-variable-name
-
Задает имя параметра [in]-only, указывающего размер (в байтах) области памяти, на которую ссылается параметр parameter-name.
-
parameter-name
-
Указывает имя параметра указателя [out]only, определенного в IDL-файле.
Комментарии
Атрибут ACF [byte_count] представляет расширение Майкрософт для DCE IDL. Поэтому этот атрибут недоступен при использовании параметра компилятора MIDL /osf.
Примечание
Атрибут [число байтов] больше не поддерживается в синтаксисе NDR64 из-за трудностей при оценке размера, необходимого для всех параметров [out] .
Память, на которую ссылается параметр указателя, является непрерывной и не выделяется и не освобождается клиентскими заглушками. Эта функция атрибута [byte_count] позволяет создать постоянную буферную область в памяти клиента, которую можно повторно использовать во время нескольких вызовов удаленной процедуры.
Возможность отключить выделение памяти заглушки клиента позволяет настроить приложение для повышения эффективности. Например, атрибут [byte_count] может использоваться функциями поставщика услуг, которые используют Microsoft RPC. Когда пользовательское приложение вызывает API поставщика услуг и отправляет указатель на буфер, поставщик служб может передать указатель буфера на удаленную функцию. Поставщик услуг может повторно использовать буфер во время нескольких удаленных вызовов, не заставляя пользователя перераспределять область памяти.
Область памяти может содержать сложные структуры данных, состоящие из нескольких указателей. Так как область памяти является непрерывной, приложению не нужно выполнять несколько вызовов, чтобы по отдельности освободить каждый указатель и структуру. Вместо этого он может выделить или освободить область памяти с помощью одного вызова выделения памяти или бесплатной подпрограммы.
Буфер должен быть параметром [out]only, а длина буфера в байтах должна быть параметром [in]-only.
Укажите буфер, который достаточно велик для хранения всех параметров [out] . Из-за скрытого заполнения используйте переоценки, а не точные подсчеты. Например, 4-байтовые указатели распаковываются на 4-байтовой границе на 32-разрядных платформах и 8-байтовые указатели на 8-байтовой границе на 64-разрядных платформах. Таким образом, выравнивание, выполняемое заглушками, должно учитываться в пространстве буфера. Кроме того, уровни упаковки, используемые во время компиляции на языке C, могут отличаться. Используйте значение счетчика байтов, которое учитывает дополнительные байты упаковки, добавленные для уровня упаковки, используемого во время компиляции на языке C. Безопасной практикой, охватывающей как 32-разрядные платформы, так и 64-разрядные платформы, является предположение, что каждый объект, впадающий в большой блок памяти, начинается с адреса, кратного 8.
Примеры
/* IDL file */
HRESULT proc1([in] unsigned long length,
[out] struct my_struct * pMyStruct);
/* ACF file */
proc1([byte_count(length)] pMyStruct);
См. также раздел