byte_count-Attribut
Das [byte_count] ACF-Attribut ist ein Parameterattribute, das dem durch den Zeiger angegebenen Speicherbereich eine Größe in Bytes zuordnet.
[ function-attribute-list ] function-name(
[byte_count(length-variable-name)] parameter-name);
...);
-
function-attribute-list
-
Gibt null oder mehr ACF-Funktionsattribute an.
-
Funktionsname
-
Gibt den Namen der in der IDL-Datei definierten Funktion an. Der Funktionsname ist erforderlich.
-
length-variable-name
-
Gibt den Namen des [rein]-reinen Parameters an, der die Größe des Speicherbereichs in Bytes angibt, auf den durch den Parameternamen verwiesen wird.
-
Parametername
-
Gibt den Namen des in der IDL-Datei definierten Zeigerparameters [out]only an.
Das ACF-Attribut [byte_count] stellt eine Microsoft-Erweiterung für DCE IDL dar. Daher ist dieses Attribut nicht verfügbar, wenn Sie den MIDL-Compilerschalter /osf verwenden.
Hinweis
Das [Byte count] -Attribut wird in der NDR64-Syntax nicht mehr unterstützt, da es schwierig ist, die für alle [out] -Parameter erforderliche Größe zu schätzen.
Der Speicher, auf den vom Zeigerparameter verwiesen wird, ist zusammenhängend und wird von den Clientstubs nicht zugeordnet oder freigegeben. Mit diesem Feature des [byte_count] -Attributs können Sie einen persistenten Pufferbereich im Clientspeicher erstellen, der während mehrerer Aufrufe der Remoteprozedur wiederverwendet werden kann.
Die Möglichkeit, die Speicherbelegung des Client-Stubs zu deaktivieren, ermöglicht es Ihnen, die Anwendung auf Effizienz zu optimieren. Das Attribut [byte_count] kann beispielsweise von Dienstanbieterfunktionen verwendet werden, die Microsoft RPC verwenden. Wenn eine Benutzeranwendung die Dienstanbieter-API aufruft und einen Zeiger an einen Puffer sendet, kann der Dienstanbieter den Pufferzeiger an die Remotefunktion übergeben. Der Dienstanbieter kann den Puffer während mehrerer Remoteaufrufe wiederverwenden, ohne dass der Benutzer den Speicherbereich neu ordnet.
Der Speicherbereich kann komplexe Datenstrukturen enthalten, die aus mehreren Zeigern bestehen. Da der Speicherbereich zusammenhängend ist, muss die Anwendung nicht mehrere Aufrufe ausführen, um jeden Zeiger und jede Struktur einzeln freizugeben. Stattdessen kann der Speicherbereich mit einem Aufruf der Speicherbelegung oder der freien Routine zugeordnet oder freigegeben werden.
Der Puffer muss ein [out]-only-Parameter sein, während die Pufferlänge in Bytes ein [rein]-only-Parameter sein muss.
Geben Sie einen Puffer an, der groß genug ist, um alle [out]- Parameter zu enthalten. Verwenden Sie aufgrund des ausgeblendeten Abstands überschätzte Werte anstelle der genauen Anzahl. Beispielsweise werden 4-Byte-Zeiger auf einer 4-Byte-Ausgerichteten Grenze auf 32-Bit-Plattformen und 8-Byte-Zeiger auf einer 8-Byte-Grenze auf 64-Bit-Plattformen aufgehoben. Daher muss der Ausrichtungsabstand, den die Stubs ausführen, im Raum für den Puffer berücksichtigt werden. Darüber hinaus können die bei der C-Sprachkompilierung verwendeten Packebenen variieren. Verwenden Sie einen Byteanzahlswert, der zusätzliche Paketbytes berücksichtigt, die für die Bei der C-Sprachkompilierung verwendete Packebene hinzugefügt wurden. Eine sichere Methode, die sowohl 32-Bit-Plattformen als auch 64-Bit-Plattformen abdeckt, besteht darin, davon auszugehen, dass jedes Objekt, das in den großen Speicherblock geht, mit einer Adresse beginnt, die ein Vielfaches von 8 ist.
/* IDL file */
HRESULT proc1([in] unsigned long length,
[out] struct my_struct * pMyStruct);
/* ACF file */
proc1([byte_count(length)] pMyStruct);