配列とSized-Pointer属性

MIDL には、データの配列とデータへのポインターを渡すための豊富な機能セットが用意されています。 これらの属性を使用して、配列の特性と複数レベルのポインターを指定できます。

属性 使用法
size_is サイズ設定されたポインター、サイズ設定されたポインターへのサイズ設定されたポインター、および単一配列または多次元配列に割り当てるメモリの量を指定します。
max_is 配列インデックスの最大値。
length_is 送信する配列要素の数。
first_is 送信される最初の配列要素のインデックス。
last_is 最後に送信される配列要素のインデックスを指定します。
文字列 1 次元 の charwchar_tバイト (または同等の) 配列、またはこのような配列へのポインターを文字列として処理することを示します。
範囲 実行時に値が設定される引数またはフィールドに使用できる値の範囲を指定します。

 

MIDL では、参照ポインター、一意ポインター、完全ポインターの 3 種類のポインターがサポートされています。 これらのポインターは、 ポインター属性 refuniqueおよび ptr によって指定されます。

ポインター属性は型属性として適用できます。構造体メンバー、共用体メンバー、またはパラメーターに適用されるフィールド属性として。または、関数の戻り値の型に適用される関数属性として。 ポインター属性は、pointer_default キーワード (keyword)と共に表示することもできます。

リモート関数中にポインター パラメーターの値を変更できるようにするには、複数のポインター宣言子を指定して、別のレベルの間接参照を指定する必要があります。 パラメーターに適用される明示的なポインター属性は、パラメーターの右端のポインター宣言子にのみ影響します。 パラメーター宣言に複数のポインター宣言子がある場合、他の宣言子は 既定で pointer_default 属性で指定されたポインター属性に設定されます。 複数のポインター宣言子に異なるポインター属性を適用するには、明示的なポインター属性を指定する中間型を定義する必要があります。

既定のPointer-Attribute値

パラメーターであるポインターにポインター属性が関連付けられていない場合、ポインターは ref ポインターであると見なされます。

構造体または共用体のメンバーであるポインターにポインター属性が関連付けられていない場合、MIDL コンパイラは、次の優先順位規則 (1 が最も高い) を使用してポインター属性を割り当てます。

  1. ポインター型に明示的に適用される属性
  2. ポインター パラメーターまたはメンバーに明示的に適用される属性
  3. 型を定義する IDL ファイル内の pointer_default 属性
  4. インポートする IDL ファイル内のpointer_default属性
  5. ptr (osf モード); unique (Microsoft RPC の既定のモード)

IDL ファイルが既定のモードでコンパイルされると、インポートされたファイルは、ファイルのインポートからポインター属性を継承できます。 /osf スイッチを使用してコンパイルする場合、この機能は使用できません。 詳細については、「 インポート」を参照してください。

関数の戻り値の型

関数によって返されるポインターは、 一意 のポインターまたは完全なポインターである必要があります。 MIDL コンパイラは、関数の結果が明示的または既定で参照ポインターである場合にエラーを報告します。 返されるポインターは常に新しいストレージを示します。

ポインター値を返す関数では、ポインター属性を関数属性として指定できます。 ポインター属性が存在しない場合、関数結果ポインターは 、pointer_default 属性として指定された値を使用します。

型定義のポインター属性

typedef ステートメントの最上位レベルでポインター属性を指定すると、指定した属性が、想定どおりにポインター宣言子に適用されます。 ポインター属性が指定されていない場合、typedef ステートメントの最上位レベルにあるポインター宣言子は、使用時にポインター属性の型を継承します。

DCE IDL では、 typedef 宣言とパラメーター属性リストの両方など、同じポインター属性を 2 回明示的に適用することはできません。 MIDL コンパイラの既定の (Microsoft 拡張機能) モードを使用すると、この制約は緩和されます。

リモート プロシージャ呼び出しでの MIDL 配列とポインターの使用については、「 配列とポインター」を参照してください。