Più livelli di puntatori
Quando sono presenti più livelli di puntatori, gli attributi vengono 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 quanto verranno restituiti i dati:
[
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, inizializzato dal server per NULL. Il server alloca quindi un bloccodio, imposta il puntatore, imposta l'argomento dimensioni 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 quindi ilmarsaling 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