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


атрибут force_allocate

Атрибут ACF [force_allocate] принудительно выделяет параметр указателя с помощью midl_user_allocate вместо оптимизации выделения.

[ [function-attribute-list <>] ] type-specifier <> [pointer- <>declarator <>] function-name <>( [ force_allocate [ , parameter-attribute-list <> ] ] type-specifier <> [declarator <>] , ...);

Параметры

Этот атрибут не имеет параметров.

Комментарии

RPC пытается свести к минимуму выделение памяти на сервере, предоставляя указатели на внутренние буферы памяти. Такой подход может вызвать проблемы для приложений, которые пытаются напрямую вызывать midl_user_free в указателях RPC, так как оптимизированный указатель не может быть освобожден. Пометка параметра с помощью [force_allocate] предотвратит такую оптимизацию для всех указателей, производных от него.

Еще одним распространенным способом использования [force_allocate] является обеспечение выравнивания памяти, на которую указывает, если приложению требуется выравнивание больше, чем у указанной памяти. Например, приложения часто передают данные в универсальном массиве байтов, а не используют фактический тип, но байт гарантированно выравнивается только по 1, что может вызвать проблемы для приложений, предполагающих большее выравнивание. Помечая параметр [force_allocate], приложение может гарантировать, что вся указанная память будет иметь выравнивание, равное выравниванию , гарантированному midl_user_allocate.

Примеры

/* IDL file */
void Func1([in, out, string] char **ppstr);
void Func2([in] long s, [in, size_is(s)] byte *pData);

/* ACF file */

/* e.g. The application wishes to call midl_user_free on *ppstr and supply a new pointer */
Func1([force_allocate] pstr);

/* e.g. pData really points to a structure that needs an alignment greater than 1 */
Func2([force_allocate] pData);

См. также раздел

Предотвращение скрытия информации

Проектирование 64-разрядных совместимых интерфейсов

midl_user_allocate

midl_user_free

Выделить