size_is 属性
[size_is] 属性を使用して、サイズの大きさのポインターに割り当てられたメモリのサイズ (要素単位)、サイズ設定されたポインターへのサイズ設定されたポインター、および単一配列または多次元配列を指定します。
[ size_is(limited-expression-list) ]
-
limited-expression-list
-
1 つ以上の C 言語式を指定します。 各式は、サイズの大きなポインターまたは配列に割り当てられたメモリの量を表す負以外の整数に評価されます。 配列の場合、 は、その配列の最初の次元の割り当てサイズを要素単位で表す単一の式を指定します。 MIDL コンパイラは、条件式、論理式、リレーショナル式、および算術式をサポートします。 MIDL では、式での関数呼び出しは許可されず、インクリメント演算子とデクリメント演算子は許可されません。 暗黙的なパラメーターのプレースホルダーとしてコンマを使用するか、複数の式を区切ります。
[size_is] 属性を使用して多次元配列のメモリを割り当て、配列 [ ] 表記を使用している場合は、実行時に多次元配列の最初の次元のみを動的に決定できることに注意してください。 その他のディメンションは静的に指定する必要があります。 [size_is] 属性を複数のレベルのポインターと共に使用して、サーバーが動的にサイズ設定されたデータ配列をクライアントに返せるようにする方法の詳細については、Proc7 の例に示すように、「 複数レベルのポインター」を参照してください。
[size_is] または max_is (両方とも同じ属性リスト内にない) を使用して、実行時に上限が決定される配列のサイズを指定できます。 ただし、[size_is] 属性は、固定されている配列ディメンションでは使用できないことに注意してください。 [max_is] 属性は、有効な配列インデックスの最大数を指定します。 その結果、[size_is(n)] を指定することは、[max_is(n-1)] を指定することと同じです。
[文字列] 属性を持つ [in] または [in, out] の適合配列パラメーターには、[size_is] 属性または [max_is] 属性は必要ありません。 この場合、割り当てのサイズは、入力文字列の NULL 終端文字から決定されます。 [string] 属性を持つ他のすべての準拠する配列には、[size_is] または [max_is] 属性が必要です。
定数で [size_is] 属性を使用することは有効ですが、これは非効率的で不要です。 たとえば、固定サイズの配列を使用します。
HRESULT Proc3([in] short Arr[MAX_SIZE]);
次のように記述する必要がありません。
// legal but marshaling code is much slower
HRESULT Proc3([in size_is(MAX_SIZE)] short Arr[] );
[size_is] 属性と [length_is] 属性を一緒に使用できます。 これを行うと、[size_is] 属性によって、データに割り当てられるメモリの量が制御されます。 [length_is] 属性は、送信される要素の数を指定します。 [size_is] 属性と [length_is] 属性で指定されたメモリの量は同じである必要はありません。 たとえば、クライアントは [in,out] パラメーターをサーバーに渡し、[size_is] を使用して大きなメモリ割り当てを指定できます。ただし、[length_is] で渡されるデータ要素の数が少なくてもかまいません。 これにより、サーバーは受信したデータよりも多くのデータを配列に格納し、クライアントに送り返すことができます。
一般に、[入力] パラメーターまたは [out] パラメーターに [size_is] と [length_is] の両方を指定することは役に立ちません。 どちらの場合も、[size_is] はメモリ割り当てを制御します。 アプリケーションで [size_is] を使用して、送信する配列よりも多くの配列要素を割り当てることができます ([length_is]で指定)。 ただし、これは非効率的です。 また、[size_is] と [length_is] に同じ値を指定するのは非効率的です。 パラメーターのマーシャリング中に余分なオーバーヘッドが発生します。 [size_is] と [length_is] の値が常に同じ場合は、[length_is] 属性を省略します。
HRESULT Proc1(
[in] short m;
[in, size_is(m)] short a[]); // If m = 10, a[10]
HRESULT Proc2(
[in] short m;
[in, size_is(m)] short b[][20]); // If m = 10, b[10][20]
HRESULT Proc3(
[in] short m;
[size_is(m)] short * pshort); /* Specifies a pointer
to an m-sized block of shorts */
HRESULT Proc4(
[in] short m;
[size_is( , m)] short ** ppshort); /* Specifies a pointer
to a pointer to an m-sized
block of shorts */
HRESULT Proc5(
[in] short m;
[size_is(m ,)] short ** ppshort); /* Specifies an
m-sized block of pointers
to shorts */
HRESULT Proc6(
[in] short m;
[in] short n;
[size_is(m,n)] short ** ppshort); /* Specifies a pointer to an
m-sized block of pointers, each
of which points to an n-sized
block of shorts. m associates with
the pointer closeest to the identifer
it decorates. n associates with rest.*/
HRESULT Proc7(
[out] long * pSize,
[out, size_is( , *pSize)] my_type ** ppMyType); /* Specifies a pointer
to a sized pointer,
which points to a block
of my_types, whose size is
unknown when the stub
calls the server. */