Application-Allocated Buffer

Die [ Byteanzahl _ des ACF-Attributs leitet die Stubs an, einen vorab zugeordneten Puffer zu verwenden, der von den Clientunterstützungsroutinen nicht zugeordnet oder ] frei wird. Das [ _ Byteanzahlattribut ] wird auf einen Zeiger oder Arrayparameter angewendet, der auf den Puffer zeigt. Sie erfordert einen Parameter, der die Puffergröße in Bytes 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 tätigen, um jeden Zeiger und jede Struktur einzeln frei zu geben. Wie bei Verwendung des [ Attributs allocate(all _ nodes) kann der Arbeitsspeicherbereich mit einem Aufruf der Speicherzuordnungsroutine oder der freien Routine zugeordnet oder ] freigerufen werden. Im Gegensatz zur Verwendung des [ Attributs allocate(all _ nodes) wird der Pufferparameter jedoch nicht vom Clientstub, ] sondern von der Clientanwendung verwaltet.

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

Im folgenden Beispiel verwendet der Parameter pRoot die 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 [ _ Byteanzahlattribut ] wird im ACF wie im folgenden Beispiel angezeigt:

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

Der aus diesen IDL- und ACF-Dateien generierte Clientstub weist den Arbeitsspeicher für diesen Puffer nicht zu oder gibt diesen frei. Der Serverstub ordnet den Puffer in einem einzigen Aufruf zu und gibt ihn mithilfe des angegebenen Größenparameters frei. Wenn die Daten für die angegebene Puffergröße zu groß sind, wird eine Ausnahme ausgelöst.