force_allocate-Attribut
Das ACF-Attribut [force_allocate] erzwingt, dass ein Zeigerparameter mithilfe von midl_user_allocate zugeordnet wird, anstatt die Zuordnung zu optimieren.
[ [function-attribute-list <>] ] type-specifier <> [pointer- <>declarator <>] function-name <>( [ force_allocate [ , parameter-attribute-list <> ] ] type-specifier <> [declarator <>] , ...);
Parameter
Dieses Attribut hat keine Parameter.
Bemerkungen
RPC versucht, die Speicherbelegungen auf dem Server zu minimieren, indem Zeiger auf interne Speicherpuffer bereitgestellt werden. Dieser Ansatz kann Probleme bei Anwendungen verursachen, die versuchen, midl_user_free direkt auf rpc-bereitgestellten Zeigern aufzurufen, da ein optimierter Zeiger nicht freigegeben werden kann. Wenn Sie einen Parameter mit [force_allocate] markieren, wird diese Optimierung für alle zeiger verhindert, die ihn ableiten.
Eine weitere häufige Verwendung von [force_allocate] besteht darin, die Ausrichtung des Speichers zu gewährleisten, auf den verwiesen wird, wenn eine Anwendung eine Ausrichtung erfordert, die größer als die des Speichers ist, auf den verwiesen wird. Beispielsweise übergeben Anwendungen Daten häufig in einem generischen Bytearray, anstatt den tatsächlichen Typ zu verwenden, aber ein Byte wird garantiert nur an 1 ausgerichtet, was zu Problemen bei Anwendungen führen kann, die von einer größeren Ausrichtung ausgehen. Indem der Parameter mit [force_allocate] markiert wird, kann die Anwendung sicherstellen, dass der gesamte Speicher, auf den verwiesen wird, eine Ausrichtung aufweist, die der durch midl_user_allocate garantierten Entspricht.
Beispiele
/* 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);
Weitere Informationen