複数レベルのポインター
ポインターのレベルが複数ある場合、属性は変数名に最も近いポインターに関連付けられます。 クライアントは、応答に関連付けられているメモリを割り当てる責任を引き続き負います。
次の例では、スタブは、返されるデータの量を事前に知らずにサーバーを呼び出すことができます。
[
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 オブジェクトの配列を解放する必要があります。
関連トピック