一意の属性
[unique] 属性は、一意のポインターを指定します。
pointer_default(unique)
typedef [ unique [[ , type-attribute-list ]] ] type-specifier declarator-list;
typedef struct-or-union-declarator
{
[ unique [[ , field-attribute-list ]] ] type-specifier declarator-list;
...}
[ unique [[ , function-attribute-list ]] ] type-specifier ptr-decl function-name(
[[ [ parameter-attribute-list ] ]] type-specifier [[declarator]]
, ...);
[[ [ function-attribute-list ] ]] type-specifier [[ptr-decl]] function-name(
[ unique [[ , parameter-attribute-list ]] ] type-specifier [[declarator]]
, ...);
パラメーター
-
type-attribute-list
-
型に適用される 1 つ以上の属性を指定します。 有効な型属性には、[handle]、[switch_type]、[transmit_as]、ポインター属性 [ref]、[unique]、または [ptr];と使用法属性 [context_handle]、[文字列]、および [ignore]。 複数の属性をコンマで区切ります。
-
type-specifier
-
基本型、構造体、共用体、列挙型、または型識別子を指定します。 オプションのストレージ仕様の前に 型指定子を指定できます。
-
declarator と declarator-list
-
識別子、ポインター宣言子、配列宣言子など、標準の C 宣言子を指定します。 詳細については、「 配列とSized-Pointer属性、 配列.、配列と ポインター」を参照してください。 declarator-list は、コンマで区切られた 1 つ以上の宣言子で構成されます。 関数宣言子のパラメーター名識別子は省略可能です。
-
struct-or-union-declarator
-
field-attribute-list
-
構造体メンバー、共用体メンバー、または関数パラメーターに適用される 0 個以上のフィールド属性を指定します。 有効なフィールド属性には、[first_is]、[last_is]、[length_is]、[max_is]、[size_is]、使用法属性 [string]、[ignore]、および [context_handle];ポインター属性 [ref]、[unique]、または [ptr];union 属性 [switch_type]。 複数のフィールド属性をコンマで区切ります。
-
function-attribute-list
-
関数に適用される 0 個以上の属性を指定します。 有効な関数属性は [callback], [local]; です。ポインター属性 [ref]、 [unique]、または [ptr];および使用法属性 [string]、 [ignore]、および [context_handle]。
-
ptr-decl
-
[unique] 属性が適用されるポインター宣言子を少なくとも 1 つ指定します。 ポインター宣言子は、C で使用されるポインター宣言子と同じです。これは、* 指定子、 far などの修飾子、および修飾子 const から構築されます。
-
function-name
-
リモート プロシージャの名前を指定します。
-
parameter-attribute-list
-
指定したパラメーター型に適した 0 個以上の属性で構成されます。 パラメーター属性は、方向属性 [in] と [out] を受け取ることができます。フィールド属性 [first_is]、[ last_is]、[ length_is]、[ max_is]、[ size_is]、および [switch_type];ポインター属性 [ref]、 unique、または ptr。と使用法属性 [context_handle] と [文字列]。 usage 属性 [ignore] を パラメーター属性として使用することはできません。 複数の属性をコンマで区切ります。
解説
ポインター属性は型属性として適用できます。構造体メンバー、共用体メンバー、またはパラメーターに適用されるフィールド属性として。または、関数の戻り値の型に適用される関数属性として使用します。 ポインター属性は 、[pointer_default] キーワードと共に表示することもできます。
一意のポインターには、次の特性があります。
- 値 NULL を指定できます。
- NULL から NULL 以外への呼び出し、NULL 以外から NULLへの呼び出し、または NULL 以外の値から別の値への呼び出し中に変更できます。
- クライアントに新しいメモリを割り当てることができます。 一意のポインターが NULL から NULL 以外に変わると、サーバーから返されたデータが新しいストレージに書き込まれます。
- 新しいメモリを割り当てずに、クライアント上の既存のメモリを使用できます。 NULL 以外の値から別の値への呼び出し中に一意のポインターが変更されると、ポインターは同じ型のデータ オブジェクトを指すと見なされます。 サーバーから返されたデータは、呼び出しの前に一意のポインターの値で指定された既存のストレージに書き込まれます。
- クライアントでメモリを孤立させることができます。 NULL 以外の一意のポインターによって参照されるメモリは、呼び出し中に一意のポインターが NULL に変更され、クライアントがストレージを逆参照する別の手段がない場合、解放されることはありません。
- エイリアスは発生しません。 参照ポインターが指すストレージと同様に、一意のポインターが指すストレージには、関数内の他の名前からは到達できません。
スタブは、一意のポインターとその参照先に必要なメモリを割り当てて割り当て解除するために 、 midl_user_allocateおよび midl_user_free ユーザー提供のメモリ管理機能を呼び出します。
一意のポインターには、次の制限が適用されます。
- [一意] 属性は、バインド ハンドル パラメーター (handle_t) およびコンテキスト ハンドル パラメーターには適用できません。
- [一意] 属性は、[out] のみの最上位ポインター パラメーター ([out] 方向属性のみを持つパラメーター) には適用できません。
- 既定では、パラメーター リスト内の最上位のポインターは [ref] ポインターです。 これは、インターフェイスが pointer_default(一意)を指定した場合でも当てはまります。 パラメーター リスト内の最上位パラメーターを一意のポインターにするには、[ unique] 属性を指定する必要があります。
- 一意のポインターは 値 NULL を持つことができますので、一意のポインターを使用して配列または共用体の腕のサイズを記述することはできません。 この制限により、配列サイズまたは共用体のサイズとして NULL 値が使用された場合に発生するエラーが回避されます。
例
pointer_default(unique)
typedef [unique, string] unsigned char * MY_STRING_TYPE;
[unique] char * MyFunction([in, out, unique] long * plNumber);
関連項目