Attributs directionnels (paramètre)
Les attributs directionnels indiquent si les données sont transmises de client à serveur, de serveur à client ou les 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) [in], 2) [out] et 3) [in, out]. Celles-ci décrivent la façon dont les paramètres sont passés entre les procédures appelantes et appelées. Lorsque vous effectuez une compilation par défaut (mode microsoft étendu) et que vous omettez un attribut directionnel pour un paramètre, le compilateur MIDL suppose une valeur par défaut de [in].
Un paramètre [out] doit être un pointeur. En fait, l’attribut [out] n’est pas significatif lorsqu’il est appliqué à des paramètres qui n’agissent pas en tant que pointeurs, car les paramètres de la 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 ; il ne peut pas modifier la valeur de la fonction appelante pour ce paramètre. Toutefois, si le paramètre sert de pointeur, il peut être utilisé pour accéder à la mémoire et le 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és à 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 [in] uniquement. Sa valeur est transmise à l’ordinateur distant, mais 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 des attributs [in] et [out]. L’attribut [in] indique que la valeur du paramètre est passée du client au serveur. L’attribut [out] indique que la valeur pointée par ps2 est retournée au client.
Le troisième paramètre est uniquement [out]. 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 [in] 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;
}
Au retour de l’appel à InOutProc, les deuxième et troisième paramètres sont modifiés. Le premier paramètre, qui est [in] uniquement, est inchangé.