partial_ignore属性

ACF 属性 [partial_ignore] は 、省略可能なセマンティクスを提供する 特殊なバージョンの [一意] ポインターを定義します。

[ [function-attribute-list <>] ] type-specifier <> [pointer- <>declarator <>] function-name <>( [ partial_ignore [ , parameter-attribute-list <> ] ] type-specifier <> [declarator <>] , ...);

解説

関数を作成するときに、ユーザーが NULL 以外のポインターを 省略可能な戻りデータ (多くの場合、省略可能な出力ポインターと呼ばれる) に指定できるようにするのが一般的です。 通常、ユーザーが指すメモリは初期化する必要はありません。 この手法は、関数が RPC 経由で使用される場合の問題を表します。

省略可能な出力ポインターが有効で、初期化されていないデータを指している場合、RPC はそのデータをマーシャリングしてサーバーに送信しようとします。これにより、マーシャリングが失敗し、呼び出しが中止される可能性があります。 マーシャリングが成功した場合でも、大量の不要なデータがサーバーに送信される可能性があります。

これらの問題は、ポインターを [in, out, unique, partial_ignore] としてマークすることで解決されます。 4 つの属性はすべて存在する必要があります。 [partial_ignore] ポインターがクライアント側でマーシャリングされると、サーバーに送信されるデータは、ポインターが NULL であるかどうかを示すインジケーターのみです。 ポインターが NULL 以外の場合、サーバー側ルーチンは、ゼロで初期化されたメモリ ブロックへの有効なポインターを受け取ります。 ポインターが NULL の場合、サーバー側ルーチンは NULL ポインターを受け取ります。

この状況では、ポインターの最大サイズは、コンパイル時に、または入力パラメーターに基づいて適切に定義する必要があります。これは、サーバーが指すメモリ位置の領域を割り当てる必要があるためです。 たとえば、単純な [string] ポインターには、文字列が NULL 文字で暗黙的に終了するため、適切に定義されたサイズがありません。 この場合、[ size_is] 属性を追加して文字列の最大サイズを指定すると、適切に定義されたサイズ要件が実現します。

/* The MoveLeft function will move one position to the left and optionally return the previous position */
void MoveLeft([in, out, unique, partial_ignore] long *pPrevPosition);

関連項目

unique