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] 属性または [string] 属性と同時に使用することはできません。
[length_is]属性または [last_is] 属性でカウントされた文字列を定義するには、[string] 属性を使用せずに文字配列またはポインターを使用します。
[length_is] 属性で定数式を使用することは、 属性の不適切な使用です。 これは有効ですが非効率的であり、コードのマーシャリングが遅くなります。
[size_is] 属性と [length_is] 属性を一緒に使用できます。 これを行うと、[ size_is] 属性によって、データに割り当てられるメモリの量が制御されます。 [length_is] 属性は、送信される要素の数を指定します。 [size_is] 属性と [length_is] 属性で指定されたメモリの量は同じである必要はありません。 たとえば、クライアントは [length_is] で渡すデータ要素の数が少ない場合でも、サーバーに [in, out] パラメーターを渡し、[size_is] で大きなメモリ割り当てを指定できます。 これにより、サーバーは受信したデータよりも多くのデータを配列に格納し、クライアントに送り返すことができます。
一般に、[入力]パラメーターまたは [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]);
関連項目