3 つのポインター型

MIDL では、さまざまなアプリケーションに対応するために、3 種類のポインターがサポートされています。 3 つの異なるレベルは、参照ポインター、一意ポインター、および完全ポインターと呼ばれ、それぞれ 属性 [ref][unique]、および [ptr] によって示されます。 これらの属性によって記述されるポインター クラスは相互に排他的です。 ポインター属性は、型定義内のポインター、関数の戻り値の型、関数パラメーター、構造体または共用体のメンバー、または配列要素に適用できます。

埋め込みポインターは、構造体または共用体のメンバーであるポインターです。 配列の要素にすることもできます。 [入力] 方向では、埋め込まれた [ref] ポインターは有効なストレージを指していると見なされ、null にすることはできません。 この状況は、指している [ref] ポインターに再帰的に適用されます。 [in] 方向では、埋め込まれた [unique] ポインターと完全ポインター ([ptr] 属性を持つポインター) が null の場合とそうでない場合があります。

関数宣言の構文でパラメーターに配置されたポインター属性は、そのパラメーターの右端のポインター宣言子にのみ影響します。 他のポインター宣言子に影響を与えるためには、中間の名前付き型を使用する必要があります。

ポインターを返す関数は、ポインター属性を関数属性として持つことができます。 [unique] 属性と [ptr] 属性は、関数の戻り値の型に適用する必要があります。 ポインターであるメンバー宣言では、ポインター属性をフィールド属性として指定できます。 ポインター属性は、 typedef コンストラクトで型属性として適用することもできます。

フィールド属性または型属性としてポインター属性が指定されていない場合、ポインター属性は、次のように属性なしポインター宣言の規則に従って適用されます。

DCE 互換モードでは、ポインター属性は定義 IDL ファイルで決定されます。 定義インターフェイスに [pointer_default**]**属性が指定されている場合は、その属性が使用されます。 [pointer_default] 属性が存在しない場合、属性が設定されていないポインターはすべて完全なポインターになります。

Microsoft 拡張機能モードでは、IDL ファイルをインポートすることによってポインター属性を決定でき、次の順序で適用されます。

  1. 使用サイトで適用される明示的なポインター属性。
  2. [ref] 属性。属性が、属性に設定されていないポインターが最上位のポインター パラメーターである場合。
  3. 定義インターフェイスで指定された [pointer_default] 属性。
  4. 基本インターフェイスで指定された [pointer_default] 属性。
  5. [unique] 属性。

[pointer_default] インターフェイス属性は、その宣言に明示的なポインター属性が適用されていない場合に、型、パラメーター、または戻り値の型宣言でポインター宣言子に適用される既定のポインター属性を指定します。 [pointer_default] インターフェイス属性は、パラメーターの属性が [ref] と見なされる未属性の最上位ポインターには適用されません。