Teilen über


Application-Allocated Puffer

Das ACF-Attribut [byte_count] leitet die Stubs an, einen vordefinierten Puffer zu verwenden, der nicht von den Clientunterstützungsroutinen zugewiesen oder freigegeben wird. Das Attribut [byte_count] wird auf einen Zeiger- oder Arrayparameter angewendet, der auf den Puffer zeigt. Er erfordert einen Parameter, der die Puffergröße in Byte angibt.

Der vom Client zugewiesene Speicherbereich kann komplexe Datenstrukturen mit mehreren Zeigern enthalten. Da der Speicherbereich zusammenhängend ist, muss die Anwendung nicht mehrere Aufrufe ausführen, um jeden Zeiger und jede Struktur einzeln freizugeben. Wie bei Verwendung des Attributs [allocate(all_nodes)] kann der Speicherbereich mit einem Aufruf der Speicherzuordnungsroutine oder der kostenlosen Routine zugewiesen oder freigegeben werden. Im Gegensatz zur Verwendung des Attributs [allocate(all_nodes)] wird der Pufferparameter jedoch nicht vom Client-Stub verwaltet, sondern von der Clientanwendung.

Der Puffer muss ein [out]-only-Parameter sein, und die Pufferlänge in Byte muss ein [in]-only-Parameter sein. Das Attribut [byte_count] kann nur auf Zeigertypen angewendet werden. Das [byte_count] ACF-Attribut ist eine Microsoft-Erweiterung für DCE IDL und ist daher nicht verfügbar, wenn Sie die MIDL-/osf Switch kompilieren.

Im folgenden Beispiel verwendet der Parameter pRoot- Byteanzahl:

/* function prototype in IDL file (fragment) */
void SortNames(
    [in] short cNames,
    [in, size_is(cNames)] STRINGTYPE pszArray[],
    [in] short cBytes,
    [out, ref] P_TREE_TYPE pRoot  /* tree with sorted data */
);

Das Attribut [byte_count] wird im ACF angezeigt als:

/* ACF file (fragment) */
SortNames([byte_count(cBytes)] pRoot);

Der von diesen IDL- und ACF-Dateien generierte Client-Stub weist den Speicher für diesen Puffer nicht zu oder frei. Der Server-Stub weist den Puffer in einem einzelnen Aufruf mithilfe des bereitgestellten Größenparameters zu und gibt ihn frei. Wenn die Daten für die angegebene Puffergröße zu groß sind, wird eine Ausnahme ausgelöst.