Несколько уровней указателей

При наличии нескольких уровней указателей атрибуты связываются с указателем, ближайшим к имени переменной. Клиент по-прежнему отвечает за выделение памяти, связанной с ответом.

Следующий пример позволяет заглушку вызывать сервер, не зная заранее, сколько данных будет возвращено:

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

В этом примере заглушка передает серверу уникальный указатель, который сервер инициализирует в значение NULL. Затем сервер выделяет блок BAR, задает указатель, задает аргумент size и возвращает значение . Обратите внимание, что для того, чтобы сервер повлиял на вызывающий объект, необходимо передать указатель [ref] на [уникальный] указатель на данные. Кроме того, обратите внимание на запятую в [size_is( , *pSize )], которая указывает, что указатель верхнего уровня не является указателем размера, а указателем нижнего уровня является .

На стороне клиента заглушка устанавливает для *ppBar значение NULL перед вызовом удаленной процедуры. Затем заглушка выделяет и отменяет выделение объектов BAR. Аргумент size указывает размер блока (и количество несмегалированных BAR). Клиент должен освободить возвращенный массив объектов BAR, если он больше не требуется.

size_is