Top-Levelポインターと埋め込みポインター
Microsoft RPC でポインターとその関連するデータ要素がどのように割り当てられるかを理解するには、 最上位のポインター と 埋め込みポインターを区別する必要があります。 また、最上位のポインターではないすべてのポインターのセットを参照する場合にも役立ちます。
最上位のポインター は、関数プロトタイプ内のパラメーターの名前として指定されるポインターです。 最上位のポインターとその参照先は、常にサーバーに割り当てられます。
埋め込みポインター は、配列、構造体、共用体などのデータ構造に埋め込まれたポインターです。 埋め込みポインターがバッファーに出力のみを書き込み、入力時に null である場合、サーバー アプリケーションは値を null 以外に変更できます。 この場合、クライアント スタブはこのデータに新しいメモリを割り当てます。
呼び出し前に埋め込みポインターがクライアントで null でない場合、スタブは、返されるときにクライアントにメモリを割り当てません。 代わりに、スタブは埋め込みポインターに関連付けられているメモリを、そのポインターに関連付けられているクライアント上の既存のメモリに書き込もうとします。既に存在するデータが上書きされます。
Note
バッファーからの読み取りまたはバッファーへの書き込みで、バッファー サイズを指定しないデータの場合、出力長は入力長以下である必要があります。 オーバーフローが検出されると、RPC 例外が発生します。 文字列データの場合、出力長は入力文字列の長さをチェックすることによって決定されます。 したがって、出力文字列は入力文字列の長さを超えることはできません。 ベスト プラクティス のガイダンスは、バッファーのサイズを示すサイズ指定のパラメーターを常に含めることで、これを回避することです。
埋め込み書き込み専用ポインターについては、「 ポインター属性と方向属性の組み合わせ」を参照してください。
"非トップレベル ポインター" という用語は、関数プロトタイプでパラメーター名として指定されていないすべてのポインターを指します。これには、埋め込みポインターと入れ子になったポインターの複数のレベルの両方が含まれます。