Partager via


mémoire tampon Application-Allocated

L’attribut ACF [byte_count] indique aux stubs d’utiliser une mémoire tampon préallouée qui n’est pas allouée ou libérée par les routines de support client. L’attribut [byte_count] est appliqué à un pointeur ou à un paramètre de tableau qui pointe vers la mémoire tampon. Elle nécessite un paramètre qui spécifie la taille de la mémoire tampon en octets.

La zone mémoire allouée par le client peut contenir des structures de données complexes avec plusieurs pointeurs. Étant donné que la zone mémoire est contiguë, l’application n’a pas besoin d’effectuer plusieurs appels pour libérer chaque pointeur et chaque structure individuellement. Comme lors de l’utilisation de l’attribut [allocate(all_nodes)], la zone mémoire peut être allouée ou libérée avec un appel à la routine d’allocation de mémoire ou à la routine libre. Toutefois, contrairement à l’utilisation de l’attribut [allocate(all_nodes)], le paramètre de mémoire tampon n’est pas géré par le stub client, mais par l’application cliente.

La mémoire tampon doit être un paramètre [out]-only et la longueur de la mémoire tampon en octets doit être un paramètre [in]-only. L’attribut [byte_count] ne peut être appliqué qu’aux types de pointeurs. L’attribut ACF [byte_count] est une extension Microsoft de DCE IDL et, en tant que tel, n’est pas disponible si vous compilez à l’aide du commutateur MIDL /osf.

Dans l’exemple suivant, le paramètre pRoot utilise le nombre d’octets :

/* 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 */
);

L’attribut [byte_count] apparaît dans l’ACF comme suit :

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

Le stub client généré à partir de ces fichiers IDL et ACF n’alloue pas ou ne libère pas la mémoire pour cette mémoire tampon. Le stub du serveur alloue et libère la mémoire tampon en un seul appel à l’aide du paramètre de taille fourni. Si les données sont trop volumineuses pour la taille de mémoire tampon spécifiée, une exception est levée.