[in, out, la taille _ est un ] prototype

Le prototype de fonction suivant utilise un tableau de caractères à un seul comptage qui reçoit les deux manières : 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 de la mémoire associée au tableau côté client avant d’effectuer l’appel de procédure distante.

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

Dans certains cas, 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 une certaine 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 de sortie ] . En C, le nom du tableau est équivalent à 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 dans la 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 que le client spécifie avant l’appel, ou les stubs génèrent une exception.

Avant de retourner, la fonction analyze sur le serveur doit réinitialiser le paramètre PCB pour indiquer le nombre d’éléments que le serveur transmet au client comme indiqué ci-dessous :

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