Più livelli di puntatori
Quando sono presenti più livelli di puntatori, gli attributi sono associati al puntatore più vicino al nome della variabile. Il client è comunque responsabile dell'allocazione di qualsiasi memoria associata alla risposta.
L'esempio seguente consente allo stub di chiamare il server senza sapere in anticipo quanti dati verranno restituiti:
[
uuid( ...),
version(3.3),
]
interface AnInterface
{
HRESULT GetBars([out] long * pSize,
[out, size_is( , *pSize)]
BAR ** ppBar);//BAR type defined elsewhere
}
In questo esempio lo stub passa al server un puntatore univoco, che il server inizializza su NULL. Il server alloca quindi un blocco di bars, imposta il puntatore, imposta l'argomento size e restituisce. Si noti che affinché il server abbia un effetto sul chiamante, è necessario passare un puntatore [ref] a un puntatore [univoco] ai dati. Si noti anche la virgola in [size_is( , *pSize )], che indica che il puntatore di primo livello non è un puntatore di dimensioni, ma che il puntatore di livello inferiore è.
Sul lato client, lo stub imposta *ppBar su NULL prima di chiamare la procedura remota. Lo stub alloca e annulla l'aspirazione dell'arry degli oggetti BAR. L'argomento size indica le dimensioni del blocco (e il numero di BAR non sposati). Il client deve liberare la matrice restituita di oggetti BAR quando non è più necessaria.
Argomenti correlati