Varios niveles de punteros

Cuando hay varios niveles de punteros, los atributos se asocian al puntero más cercano al nombre de la variable. El cliente sigue siendo responsable de asignar cualquier memoria asociada a la respuesta.

En el ejemplo siguiente se permite que el código auxiliar llame al servidor sin saber con antelación la cantidad de datos que se devolverán:

[
    uuid( ...),
    version(3.3),
]
interface AnInterface
{
    HRESULT GetBars([out] long * pSize,
             [out, size_is( , *pSize)]
             BAR ** ppBar);//BAR type defined elsewhere
}

En este ejemplo, el código auxiliar pasa al servidor un puntero único, que el servidor inicializa en NULL. A continuación, el servidor asigna un bloque de BAR, establece el puntero, establece el argumento size y devuelve. Tenga en cuenta que para que el servidor tenga un efecto en el autor de la llamada, debe pasar un puntero [ref] a un puntero [único] a los datos. Tenga en cuenta también la coma de [size_is( , *pSize )], que indica que el puntero de nivel superior no es un puntero de tamaño, pero que el puntero de nivel inferior es.

En el lado cliente, el código auxiliar establece *ppBar en NULL antes de llamar al procedimiento remoto. A continuación, el código auxiliar asigna y anula la separación de los objetos BAR. El argumento size indica el tamaño del bloque (y el número de BAR no eshalados). El cliente debe liberar la matriz de objetos BAR devuelta cuando ya no es necesario.

size_is