атрибут 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);
См. также раздел