Compartilhar via


Vários níveis de ponteiros

Quando há vários níveis de ponteiros, os atributos são associados ao ponteiro mais próximo do nome da variável. O cliente ainda é responsável por alocar qualquer memória associada à resposta.

O exemplo a seguir permite que o stub chame o servidor sem saber com antecedência quantos dados serão retornados:

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

Neste exemplo, o stub passa ao servidor um ponteiro exclusivo, que o servidor inicializa para NULL. Em seguida, o servidor aloca um bloco de BARs, define o ponteiro, define o argumento size e retorna. Observe que, para que o servidor tenha um efeito sobre o chamador, você deve passar um ponteiro [ref] para um ponteiro [exclusivo] para seus dados. Observe também a vírgula em [size_is( , *pSize )], que indica que o ponteiro de nível superior não é um ponteiro de tamanho, mas que o ponteiro de nível inferior é.

No lado do cliente, o stub define *ppBar como NULL antes de chamar o procedimento remoto. Em seguida, o stub aloca e desmarca o arry de objetos BAR. O argumento size indica o tamanho do bloco (e o número de BARs nãomarsalizados). O cliente deve liberar a matriz retornada de objetos BAR quando ela não for mais necessária.

size_is