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 la mémoire associée à la réponse.

L’exemple suivant permet au stub d’appeler le serveur sans savoir à 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 passe au serveur un pointeur unique, que le serveur initialise sur NULL. Le serveur alloue ensuite un bloc de fichiers BAR, définit le pointeur, définit l’argument size et retourne. Notez que pour que le serveur ait un effet sur l’appelant, vous devez passer un pointeur [ref] à un pointeur [unique] 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 dimensionné, 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 démarshale ensuite l’arry des objets BAR. L’argument size indique la taille du bloc (et le nombre de demandes d’accès non délimitées). Le client doit libérer le tableau renvoyé d’objets BAR lorsqu’il n’est plus nécessaire.

size_is