length_is 属性
[length_is] 属性は、送信する配列要素の数を指定します。 負以外の値を指定する必要があります。
[length_is( limited-expression-list )]
パラメーター
-
limited-expression-list
-
1 つ以上の C 言語式を指定します。 各式は、送信する配列要素の数を表す整数に評価されます。 MIDL コンパイラでは、条件式、論理式、リレーショナル式、および算術式がサポートされています。 MIDL では、式での関数呼び出しは許可されず、インクリメント演算子とデクリメント演算子は許可されません。 複数の式をコンマで区切ります。
解説
[length_is] 属性は、[last_is] が指定されていない場合、[last_is] 属性に対応する配列インデックスの値を決定します。 これらの配列インデックス間の関係は、length = last - first + 1 です。
[length_is] 属性は、[last_is] 属性または [文字列] 属性と同時に使用することはできません。
[length_is] 属性または [last_is] 属性を使用してカウントされる文字列を定義するには、文字配列またはポインターを [string] 属性なしで使用します。
定数式を [length_is] 属性と共に使用することは、属性を不適切に使用する方法です。 これは有効ですが非効率的であり、コードのマーシャリングが遅くなります。
[size_is] 属性と [length_is] 属性を一緒に使用できます。 これを行うと、[ size_is] 属性によって、データに割り当てられるメモリの量が制御されます。 [length_is] 属性は、送信される要素の数を指定します。 [size_is] 属性と [length_is] 属性で指定されたメモリの量は同じである必要はありません。 たとえば、クライアントは サーバーに [in, out] パラメーターを渡し、[ size_is] を使用して大きなメモリ割り当てを指定できます。ただし、[ length_is] で渡すデータ要素の数が少なくてもかまいません。 これにより、サーバーは受信したデータよりも多くのデータを配列に格納し、クライアントに送信できます。
一般に、[in] パラメーターまたは [out] パラメーターに[size_is] と [length_is]の両方を指定することは役に立ちません。 どちらの場合も、[ size_is] は メモリ割り当てを制御します。 アプリケーションでは 、[size_is] を使用して、送信する配列要素よりも多くの配列要素を割り当てることができます ( [length_is]で指定)。 ただし、これは非効率的です。 また、[size_is] と [length_is] に同じ値を指定するのは非効率的です。 パラメーターのマーシャリング中に余分なオーバーヘッドが発生するためです。 [size_is] と [length_is] の値が常に同じである場合は、[length_is] 属性を省略します。
例
/* counted string holding at most "size" characters */
typedef struct
{
unsigned short size;
unsigned short length;
[size_is(size), length_is(length)] char string[*];
} COUNTED_STRING_TYPE;
/* counted string holding at most 80 characters */
typedef struct
{
unsigned short length;
[length_is(length)] char string[80];
} STATIC_COUNTED_STRING_TYPE;
HRESULT Proc1(
[in] short iLength;
[in, length_is(iLength)] short asNumbers[10]);
関連項目