一意の属性

[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]が含まれます。pointer 属性 [ref][unique]、または [ptr];および使用法属性 [context_handle][string]、および [ignore]。 複数の属性をコンマで区切ります。

type-specifier

基本型構造体共用体列挙型、または型識別子を指定します。 オプションのストレージ仕様は 、type-specifier の前に置くことができます。

declarator と declarator-list

識別子、ポインター宣言子、配列宣言子などの標準 C 宣言子を指定します。 詳細については、「 配列とSized-Pointer属性配列、および 配列とポインター」を参照してくださいdeclarator-list は、コンマで区切られた 1 つ以上の宣言子で構成されます。 関数宣言子のパラメーター名識別子は省略可能です。

struct-or-union-declarator

MIDL 構造体 または 共用体 宣言子を指定します。

field-attribute-list

構造体メンバー、共用体メンバー、または関数パラメーターに適用される 0 個以上のフィールド属性を指定します。 有効なフィールド属性には、[first_is]、[last_is]、[length_is]、[max_is]、[size_is];usage 属性 [string], [ignore], and [context_handle];pointer 属性 [ref][unique]、または [ptr];と union 属性 [switch_type]。 複数のフィールド属性をコンマで区切ります。

function-attribute-list

関数に適用される 0 個以上の属性を指定します。 有効な関数属性は [callback], [local];pointer 属性 [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。と usage 属性 [context_handle][string]。 usage 属性 [ignore] を パラメーター属性として使用することはできません。 複数の属性をコンマで区切ります。

注釈

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

一意のポインターには、次の特性があります。

  • 値 NULL を指定できます。
  • 呼び出し中に NULL から NULL 以外、NULL 以外から NULLに、または NULL 以外の値から別の値に変更できます。
  • クライアントに新しいメモリを割り当てることができます。 一意のポインターが NULL から NULL 以外に変更されると、サーバーから返されたデータが新しいストレージに書き込まれます。
  • 新しいメモリを割り当てずに、クライアント上の既存のメモリを使用できます。 NULL 以外の値から別の値への呼び出し中に一意のポインターが変更されると、ポインターは同じ型のデータ オブジェクトを指していると見なされます。 サーバーから返されたデータは、呼び出しの前に一意のポインターの値で指定された既存のストレージに書き込まれます。
  • クライアントでメモリを孤立させることができます。 NULL 以外の一意のポインターによって参照されるメモリは、呼び出し中に一意のポインターが NULL に変更され、クライアントがストレージを逆参照する別の手段を持っていない場合に解放されることはありません。
  • エイリアシングは発生しません。 参照ポインターが指すストレージと同様に、一意のポインターが指すストレージには、関数内の他の名前からは到達できません。

スタブは、ユーザー指定のメモリ管理機能 をmidl_user_allocate 呼び出し、一意のポインターとその参照先に必要なメモリを割り当ておよび割り当て解除する midl_user_free します。

一意のポインターには、次の制限が適用されます。

  • [unique] 属性は、バインド ハンドル パラメーター ( handle_t) およびコンテキスト ハンドル パラメーターには適用できません。
  • [unique] 属性は、[out] のみの最上位ポインター パラメーター ([out] 方向属性のみを持つパラメーター) には適用できません。
  • 既定では、パラメーター リストの最上位ポインターは [ref] ポインターです。 これは、インターフェイスが pointer_default(unique)を指定している場合でも当てはまります。 一意のポインターにするには、パラメーター リストの最上位パラメーターを [unique] 属性で指定する必要があります。
  • 一意のポインターは NULL 値を持つ可能性があるため、一意のポインターを使用して配列または共用体のアームのサイズを記述することはできません。 この制限により、 NULL 値が配列サイズまたは共用体のサイズとして使用された場合に発生するエラーが回避されます。

pointer_default(unique) 
 
typedef [unique, string] unsigned char * MY_STRING_TYPE; 
 
[unique] char * MyFunction([in, out, unique] long * plNumber);

関連項目

配列

配列とポインター

配列とSized-Pointer属性

MIDL 基本型

コールバック (callback)

const

context_handle

Enum

first_is

処理

handle_t

無視

last_is

length_is

地元の

max_is

midl_user_allocate

midl_user_free

pointer_default

Ptr

参考

size_is

文字列

構造 体

switch_type

transmit_as

連合