attribut partial_ignore

L’attribut ACF [partial_ignore] définit une version spécialisée des pointeurs [uniques] qui fournit une sémantique facultative.

[ [function-attribute-list <>] ] type-specifier <> [pointer- <>declarator <>] function-name <>( [ partial_ignore [ , parameter-attribute-list <> ] ] type-specifier <> [declarator <>] , ...);

Notes

Lors de la création d’une fonction, il est courant d’autoriser les utilisateurs à spécifier un pointeur non NULL vers des données de retour facultatives, souvent appelée pointeur de sortie facultatif. La mémoire pointée par l’utilisateur n’a généralement pas besoin d’être initialisée. Cette technique représente un problème lorsque la fonction est utilisée sur RPC.

Si le pointeur de sortie facultatif est valide, mais pointe vers des données non initialisées, RPC tente de marshaler ces données et de les envoyer au serveur, ce qui peut entraîner l’échec du marshaling et l’abandon de l’appel. Même si le marshaling réussit, une quantité potentiellement importante de données inutiles est envoyée au serveur.

Ces problèmes sont résolus en marquant le pointeur sur [in, out, unique, partial_ignore]. Les quatre attributs doivent être présents. Lorsqu’un pointeur [partial_ignore] est marshalé côté client, les seules données envoyées au serveur sont un indicateur indiquant si le pointeur a la valeur NULL. Si le pointeur n’est pas NULL, la routine côté serveur reçoit un pointeur valide vers un bloc de mémoire qui a été initialisé avec des zéros. Si le pointeur a la valeur NULL, la routine côté serveur reçoit un pointeur NULL .

Dans ce cas, la taille maximale du pointeur doit être bien définie au moment de la compilation ou en fonction des paramètres d’entrée, car le serveur doit allouer de l’espace pour l’emplacement mémoire vers lequel il pointe. Par exemple, un pointeur [chaîne] simple n’a pas une taille bien définie, car la chaîne est implicitement terminée par un caractère NULL. Dans ce cas, la spécification de la taille maximale de la chaîne en ajoutant un attribut [size_is] permet d’atteindre l’exigence de taille bien définie.

Exemples

/* The MoveLeft function will move one position to the left and optionally return the previous position */
void MoveLeft([in, out, unique, partial_ignore] long *pPrevPosition);

Voir aussi

Unique