Поделиться через


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

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

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

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

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

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

size_is