多次元配列

配列属性は、多次元配列でも使用できます。 ただし、配列のすべての次元に対応する属性があることを確認してください。 次に例を示します。

/* IDL file */
[ 
  uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
  version(2.0)
]
interface multiarray
{
  void arr2d( [in] short        d1size,
              [in] short        d2len,
              [in, size_is( d1size, ), length_is ( , d2len) ] long array2d[*][30] ) ;
}

上記の配列は、30 個の要素配列 (d2len 要素ごとに出荷される) の適合配列 (サイズ d1size) です。 [size_is] 属性のかっこ内のコンマは、d1size の値が配列の最初の次元に適用されることを指定します。 同様に、[length_is] 属性のかっこ内のコマンドは、d2len の値が配列の 2 番目の次元に適用されることを示します。

MIDL 2.0 コンパイラには、パラメーターをマーシャリングするための 2 つのメソッドが用意されています。混合モード (/Os) と完全解釈 (/Oif または /Oicf)。 既定では、MIDL コンパイラは混合モードでインターフェイスをコンパイルします。 混合モードマーシャリングを取得するために 、/Os スイッチを明示的に指定する必要はありません。

完全に解釈されたメソッドは、データを完全にオフラインでマーシャリングします。 これによりスタブ コードのサイズが大幅に小さくなりますが、パフォーマンスも低下します。 混合モードマーシャリングでは、スタブによって一部のパラメーターがオンラインでマーシャリングされます。 これによりスタブ サイズが大きくなりますが、パフォーマンスも向上します。

注意事項

このモードで IDL ファイルをコンパイルする場合は注意が必要です。 混合モードで多次元配列を使用すると、パラメーターが正しくマーシャリングされない可能性があります。 インターフェイスで多次元配列であるパラメーターを定義する場合は、 /Oicf コマンド ライン スイッチをお勧めします。

 

[string] 属性は、多次元配列でも使用できます。 属性は、文字列の一致する配列など、最下位次元に適用されます。 多次元ポインター属性を使用することもできます。 次に例を示します。

/* IDL file */
[ 
  uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
  version(2.0)
]
interface multiarray
{
  void arr2d([in] short  d1len,
             [in] short  d2len,
             [in] size_is(d1len, d2len) ] long  ** ptr2d) ;
}

前の例では、変数 ptr2d は d1len サイズのポインター ブロックへのポインターであり、それぞれが d2len ポインターを long を指しています。

多次元配列は、ポインターの配列と同じではありません。 多次元配列は、メモリ内の単一の大きなデータ ブロックです。 ポインターの配列には、配列内のポインターのブロックのみが含まれます。 ポインターが指すデータは、メモリ内の任意の場所にすることができます。 また、ANSI C 構文では、多次元配列で最も重要な (左端の) 配列次元のみを指定できます。 したがって、有効なステートメントは次のとおりです。

long a1[] [20]

これを次の無効なステートメントと比較します。

long a1[20] []