Несколько уровней указателей
При наличии нескольких уровней указателей атрибуты связываются с указателем, ближайшим к имени переменной. Клиент по-прежнему отвечает за выделение памяти, связанной с ответом.
Следующий пример позволяет заглушку вызывать сервер, не зная заранее, сколько данных будет возвращено:
[
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, если он больше не требуется.
Связанные темы