Plusieurs niveaux de pointeurs
Lorsqu’il existe plusieurs niveaux de pointeurs, les attributs sont associés au pointeur le plus proche du nom de la variable. Le client est toujours responsable de l’allocation de toute mémoire associée à la réponse.
L’exemple suivant permet au stub d’appeler le serveur sans connaître à l’avance la quantité de données retournées :
[
uuid( ...),
version(3.3),
]
interface AnInterface
{
HRESULT GetBars([out] long * pSize,
[out, size_is( , *pSize)]
BAR ** ppBar);//BAR type defined elsewhere
}
Dans cet exemple, le stub transmet au serveur un pointeur unique, que le serveur initialise à NULL. Le serveur alloue ensuite un bloc de RBA, définit le pointeur, définit l’argument de taille et retourne. Notez que pour que le serveur ait un effet sur l’appelant, vous devez passer un pointeur [ref] à un pointeur [unique] pointeur vers vos données. Notez également la virgule dans [size_is( , *pSize )], qui indique que le pointeur de niveau supérieur n’est pas un pointeur de taille, mais que le pointeur de niveau inférieur est.
Côté client, le stub définit *ppBar sur null avant d’appeler la procédure distante. Le stub alloue et annule ensuite l’arry des objets BAR. L’argument de taille indique la taille du bloc (et le nombre de bars non délimités). Le client doit libérer le tableau d’objets BAR retourné lorsqu’il n’est plus nécessaire.
Rubriques connexes