atributo force_allocate
O atributo ACF [force_allocate] força um parâmetro de ponteiro a ser alocado usando midl_user_allocate em vez de otimizar a alocação.
[ [function-attribute-list <>] ] type-specifier <> [pointer- <>declarator <>] function-name <>( [ force_allocate [ , parameter-attribute-list <> ] ] type-specifier <> [declarator <>] , ...);
Parâmetros
Esse atributo não tem parâmetros.
Comentários
O RPC tenta minimizar as alocações de memória no servidor fornecendo ponteiros para buffers de memória internos. Essa abordagem pode causar problemas para aplicativos que tentam chamar diretamente midl_user_free em ponteiros fornecidos por RPC, pois um ponteiro que foi otimizado não pode ser liberado. Marcar um parâmetro com [force_allocate] impedirá essa otimização para todos os ponteiros que o derivam.
Outro uso comum para [force_allocate] é garantir o alinhamento da memória apontada se um aplicativo exigir um alinhamento maior que o da memória apontada. Por exemplo, os aplicativos geralmente passam dados em uma matriz genérica de bytes em vez de usar o tipo real, mas só há garantia de que um byte seja alinhado em 1, o que pode causar problemas para aplicativos que assumem um alinhamento maior. Ao marcar o parâmetro com [force_allocate], o aplicativo pode garantir que toda a memória apontada terá um alinhamento igual ao garantido por midl_user_allocate.
Exemplos
/* 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);
Confira também