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 は、内部メモリ バッファーへのポインターを指定することで、サーバー上のメモリ割り当てを最小限に抑えようとします。 この方法では、最適化されたポインターを解放できないため、RPC 提供のポインターで midl_user_free を直接呼び出そうとするアプリケーションで問題が発生する可能性があります。 パラメーターを [force_allocate] で マークすると、それを派生するすべてのポインターに対するこの最適化が妨げられます。
[force_allocate] のもう 1 つの一般的な用途は、アプリケーションが指すメモリよりも大きいアラインメントが必要な場合に、指すメモリの配置を保証することです。 たとえば、アプリケーションは、実際の型を使用するのではなく、バイトのジェネリック配列でデータを渡すことがよくありますが、バイトは 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);
関連項目