Attributs directionnels (paramètre)
Les attributs directionnels décrivent si les données sont transmises du client au serveur, au serveur au client ou aux deux. Tous les paramètres du prototype de fonction doivent être associés à des attributs directionnels. Les trois combinaisons possibles d’attributs directionnels sont : 1) [dans], 2) [out], et 3) [en, out]. Celles-ci décrivent la façon dont les paramètres sont passés entre les appels et les procédures appelées. Lorsque vous compilez en mode par défaut (mode étendu Microsoft) et que vous omettez un attribut directionnel pour un paramètre, le compilateur MIDL suppose une valeur par défaut [dans].
Un paramètre [out] doit être un pointeur. En fait, l’attribut [out] n’est pas significatif lorsqu’il est appliqué aux paramètres qui n’agissent pas en tant que pointeurs, car les paramètres de fonction C sont passés par valeur. En C, la fonction appelée reçoit une copie privée de la valeur du paramètre ; elle ne peut pas modifier la valeur de la fonction appelante pour ce paramètre. Si le paramètre agit en tant que pointeur, il peut être utilisé pour accéder à la mémoire et la modifier. L’attribut [out] indique que la fonction serveur doit retourner la valeur à la fonction appelante du client, et que la mémoire associée au pointeur doit être retournée conformément aux attributs attribués au pointeur.
L’interface suivante illustre les trois combinaisons possibles d’attributs directionnels qui peuvent être appliquées à un paramètre. La fonction InOutProc est définie dans le fichier IDL comme suit :
void InOutProc ([in] short s1,
[in, out] short * ps2,
[out] float * pf3);
Le premier paramètre, s1, est [dans] uniquement. Sa valeur est transmise à l’ordinateur distant, mais elle n’est pas retournée à la procédure appelante. Bien que l’application serveur puisse modifier sa valeur pour s1, la valeur de s1 sur le client est la même avant et après l’appel.
Le deuxième paramètre, ps2, est défini dans le prototype de fonction en tant que pointeur avec les deux attributs [dans] et [des attributs]. L’attribut [dans] indique que la valeur du paramètre est passée du client au serveur. L’attribut [out] indique que la valeur indiquée par ps2 est retournée au client.
Le troisième paramètre est [out] uniquement. L’espace est alloué pour le paramètre sur le serveur, mais la valeur n’est pas définie lors de l’entrée. Comme mentionné ci-dessus, tous les paramètres [out] doivent être des pointeurs.
La procédure distante modifie la valeur des trois paramètres, mais seules les nouvelles valeurs des paramètres [out] et [dans] sont disponibles pour le client.
#define MAX 257
void InOutProc(short s1,
short * ps2,
float * pf3)
{
*pf3 = (float) s1 / (float) *ps2;
*ps2 = (short) MAX - s1;
s1++; // in only; not changed on the client side
return;
}
Lors du retour de l’appel à InOutProc, les deuxième et troisième paramètres sont modifiés. Le premier paramètre, qui est [dans] uniquement, n’est pas modifié.