Partager via


[in, out, size_is] Prototype

Le prototype de fonction suivant utilise un tableau de caractères à comptage unique transmis dans les deux sens : du client au serveur et du serveur au client :

#define STRSIZE 500 //maximum string length

void Analyze(
    [in, out, length_is(*pcbSize), size_is(STRSIZE)] char  achInOut[],
    [in, out]  long *pcbSize);

En tant que paramètre [in], achInOut doit pointer vers un stockage valide côté client. Le développeur alloue la mémoire associée au tableau côté client avant d’effectuer l’appel de procédure distante.

Les stubs utilisent la strsize du paramètre [size_is] pour allouer de la mémoire sur le serveur, puis le paramètre [length_is] pcbSize pour transmettre les éléments du tableau dans cette mémoire. Le développeur doit s’assurer que le code client définit la variable [length_is] avant d’appeler la procédure distante.

Dans certaines situations, l’utilisation de paramètres distincts au lieu d’une chaîne unique pour l’entrée et la sortie est plus efficace et offre de la flexibilité. Cela est illustré dans l’exemple suivant :

/* client */ 
char achInOut[STRSIZE];
long cbSize;
...
gets_s(achInOut, STRSIZE);       // get patient input
cbSize = strlen(achInOut) + 1;   // transmit '\0' too
Analyze(achInOut, &cbSize);

Dans l’exemple précédent, le tableau de caractères achInOut est également utilisé comme paramètre [out]. En C, le nom du tableau équivaut à l’utilisation d’un pointeur. Par défaut, tous les pointeurs de niveau supérieur sont des pointeurs de référence : ils ne changent pas de valeur et pointent vers la même zone de mémoire sur le client avant et après l’appel. Toute la mémoire à laquelle la procédure distante accède doit correspondre à la taille spécifiée par le client avant l’appel, sinon les stubs génèrent une exception.

Avant de retourner, la fonction Analyze sur le serveur doit réinitialiser le paramètre pcbSize pour indiquer le nombre d’éléments que le serveur va transmettre au client, comme indiqué :

/* server */ 
Analyze(char * str, long * pcbSize)
{
   ...
   *pcbSize = strlen(str) + 1; // transmit '\0' too
   return;
}