配列と Sized-Pointer 属性
MIDL には、データの配列とデータへのポインターを渡すための豊富な機能セットが用意されています。 これらの属性を使用して、配列の特性と複数レベルのポインターを指定できます。
属性 | 使い |
---|---|
size_is | サイズ設定されたポインター、サイズ設定されたポインターへのサイズ設定されたポインター、および単一または多次元配列に割り当てるメモリの量を指定します。 |
max_is | 配列インデックスの最大値。 |
length_is | 送信する配列要素の数。 |
first_is | 送信する最初の配列要素のインデックス。 |
last_is | 送信する最後の配列要素のインデックスを指定します。 |
文字列をする | 1 次元 char、wchar_t、バイト (または同等の) 配列、またはそのような配列へのポインターを文字列として処理することを示します。 |
範囲 | 実行時に値が設定される引数またはフィールドに使用できる値の範囲を指定します。 |
MIDL では、参照ポインター、一意のポインター、完全なポインターの 3 種類のポインターがサポートされています。 これらのポインターは、ref、一意の、および ptrポインター属性によって指定されます。
ポインター属性は型属性として適用できます。構造体メンバー、共用体メンバー、またはパラメーターに適用されるフィールド属性。または、関数の戻り値の型に適用される関数属性として。 ポインター属性は、pointer_default キーワードと共に表示することもできます。
リモート関数中にポインター パラメーターの値を変更できるようにするには、複数のポインター宣言子を指定して、別のレベルの間接参照を指定する必要があります。 パラメーターに適用される明示的なポインター属性は、パラメーターの右端のポインター宣言子にのみ影響します。 パラメーター宣言に複数のポインター宣言子がある場合、他の宣言子は既定で、pointer_default 属性で指定されたポインター属性になります。 複数のポインター宣言子に異なるポインター属性を適用するには、明示的なポインター属性を指定する中間型を定義する必要があります。
既定の Pointer-Attribute 値
パラメーターであるポインターにポインター属性が関連付けられていない場合、ポインターは ref ポインターであると見なされます。
構造体または共用体のメンバーであるポインターにポインター属性が関連付けられていない場合、MIDL コンパイラーは、次の優先順位規則 (1 が最も高い) を使用してポインター属性を割り当てます。
- ポインター型に明示的に適用される属性
- ポインター パラメーターまたはメンバーに明示的に適用される属性
- 型を定義する IDL ファイル内の pointer_default 属性
- 型をインポートする IDL ファイル内の pointer_default 属性
- ptr (osf モード);一意の (Microsoft RPC の既定のモード)
IDL ファイルが既定のモードでコンパイルされると、インポートされたファイルはファイルのインポートからポインター属性を継承できます。 この機能は、osfスイッチを使用してコンパイル場合は使用できません。 詳細については、「インポートする」を参照してください。
関数の戻り値の型
関数によって返されるポインターは、一意の ポインターまたは完全ポインターである必要があります。 MIDL コンパイラは、関数の結果が明示的または既定で参照ポインターである場合にエラーを報告します。 返されるポインターは、常に新しいストレージを示します。
ポインター値を返す関数は、ポインター属性を関数属性として指定できます。 ポインター属性が存在しない場合、関数結果ポインターは、pointer_default 属性として指定された値を使用します。
型定義のポインター属性
typedef ステートメントの最上位レベルでポインター属性を指定すると、指定した属性がポインター宣言子に想定どおりに適用されます。 ポインター属性が指定されていない場合、typedef ステートメントの最上位レベルのポインター宣言子は、ポインター属性の型を使用すると継承します。
DCE IDL では、typedef 宣言とパラメーター属性リストの両方で、同じポインター属性を明示的に 2 回適用することはできません。 MIDL コンパイラの既定の (Microsoft 拡張機能) モードを使用する場合、この制約は緩和されます。
リモート プロシージャ 呼び出しで MIDL 配列とポインターを使用する方法の詳細については、「配列とポインターの を参照してください。