Mehrere Zeigerebenen

Wenn mehrere Zeigerebenen vorhanden sind, werden die Attribute dem Zeiger zugeordnet, der dem Variablennamen am nächsten ist. Der Client ist weiterhin für die Zuweisung von Arbeitsspeicher verantwortlich, der der Antwort zugeordnet ist.

Im folgenden Beispiel kann der Stub den Server aufrufen, ohne vorher zu wissen, wie viele Daten zurückgegeben werden:

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

In diesem Beispiel übergibt der Stub dem Server einen eindeutigen Zeiger, den der Server mit NULL initialisiert. Der Server weist dann einen Block von BARs zu, legt den Zeiger fest, legt das Größenargument fest und gibt zurück. Beachten Sie, dass Sie einen [ref]-Zeiger an einen [eindeutigen] Zeiger auf Ihre Daten übergeben müssen, damit der Server eine Auswirkung auf den Aufrufer hat. Beachten Sie auch das Komma in [size_is( , *pSize )], das angibt, dass der Zeiger der obersten Ebene kein Zeiger der Größe ist, sondern dass der Zeiger der unteren Ebene ist.

Auf der Clientseite legt der Stub *ppBar auf NULL fest, bevor die Remoteprozedur aufgerufen wird. Der Stub weist dann die Rückstände von BAR-Objekten zu und entmarshaliert sie. Das Size-Argument gibt die Größe des Blocks (und die Anzahl der nichtmarshalierten BARs) an. Der Client muss das zurückgegebene Array von BAR-Objekten freigeben, wenn es nicht mehr erforderlich ist.

size_is