ptr 属性

[ptr] 属性は、ポインターを完全なポインターとして指定します。

pointer_default(ptr)

typedef [ ptr [ , type-attribute-list ] ] type-specifier declarator-list; 

typedef [ struct | union ]
{
    [ ptr [ , field-attribute-list ] ] type-specifier declarator-list;
    ...
}

[ ptr [ , function-attribute-list ] ] type-specifier ptr-decl function-name(
    [ [ parameter-attribute-list ] ] type-specifier [standard-declarator]
    , ...);

[[ [ function-attribute-list ] ]] type-specifier [[ptr-decl]] function-name(
    [ ptr [[ , parameter-attribute-list ]] ] type-specifier [[standard-declarator]]
    , ...);

パラメーター

type-attribute-list

型に適用される 1 つ以上の属性を指定します。 有効な型属性には、[handle]、[switch_type]、[transmit_as]が含まれます。ポインター属性 [ref][unique、または [ptr];および使用法属性 [context_handle][string]、および [ignore]。 複数の属性をコンマで区切ります。

type-specifier

基本型構造体共用体、または列挙型または型識別子を指定します。 省略可能なストレージ仕様は 、型指定子の前に置くことができます。

standard-declarator

識別子、ポインター宣言子、配列宣言子などの標準 C 宣言子を指定します。 詳細については、「 配列とSized-Pointer属性配列、および 配列とポインター」を参照してください

declarator-list

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

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];と usage 属性 [string][ignore]、および [context_handle]

ptr-decl

[ptr] 属性が適用されるポインター宣言子を少なくとも 1 つ指定します。 ポインター宣言子は、C で使用されるポインター宣言子と同じです。これは、 * 指定子、 far などの修飾子、および修飾子 const から構築 されます

function-name

リモート プロシージャの名前を指定します。

parameter-attribute-list

指定したパラメーター型に適した 0 個以上の属性で構成されます。 パラメーター属性は、方向属性を送受信できます。フィールド属性first_islast_islength_ismax_issize_isおよびswitch_type。ポインター属性 refunique、または [ptr];と の使用法属性context_handle文字列です。 usage 属性 ignore はパラメーター属性として使用できません。 複数の属性をコンマで区切ります。

解説

[ptr] 属性によって指定された完全なポインターは、C 言語ポインターの完全な機能に近づきます。 完全なポインターは NULL 値を持つ可能性があり、呼び出し中に NULL から NULL 以外に変更できます。 完全なポインターによって指されるストレージは、別名作成とサイクルをサポートするアプリケーション内の他の名前で到達できます。 この機能では、ポインターによって参照されるデータを識別し、値が NULL であるかどうかを判断し、2 つのポインターが同じデータを指しているかどうかを検出するために、リモート プロシージャ呼び出し中により多くのオーバーヘッドが必要になります。

次の場合は、完全なポインターを使用します。

  • リモート戻り値。
  • 出力パラメーターのサイズがわからない場合は、二重ポインター。
  • NULL ポインター。

完全 (および一意) ポインターは、配列または共用体のサイズを記述するために使用できません。これらのポインターの値は NULL になる可能性があるためです。 MIDL によるこの制限により、 NULL 値がサイズとして使用される場合に発生する可能性があるエラーを防ぐことができます。

参照ポインターと一意のポインターは、データのエイリアシングを引き起こさないことを前提としています。 一意のポインターまたは参照ポインターから開始し、一意または参照ポインターのみに従って取得された有向グラフには、再変換もサイクルも含まれていません。

エイリアシングを回避するには、同じクラスのポインターの入力ポインターからすべてのポインター値を取得する必要があります。 複数のポインターが同じメモリ位置を指している場合、このようなポインターはすべて完全なポインターである必要があります。

場合によっては、完全なポインターと一意のポインターを混在させることができます。 割り当てが一意のポインターの値の変更に関する制限に違反しない限り、完全なポインターに一意のポインターの値を割り当てることができます。 ただし、完全なポインターの値を一意のポインターに割り当てると、エイリアシングが発生する可能性があります。

完全なポインターと一意のポインターを混在させると、次の例に示すようにエイリアシングが発生する可能性があります。

typedef struct 
{ 
    [ptr] short * pdata;          // full pointer  
} GRAPH_NODE_TYPE; 
 
typedef struct 
{ 
    [unique] graph_node * left;   // unique pointer  
    [unique] graph_node * right;  // unique pointer 
} TREE_NODE_TYPE; 
 
// application code: 
short a = 5; 
TREE_NODE_TYPE * t; 
GRAPH_NODE_TYPE g, h; 
 
g.pdata = h.pdata = &a; 
t->left = &g; 
t->right = &h; 
// t->left->pdata == t->right->pdata == &a

"t-left>" と "t-right>" は一意のメモリ位置を指しますが、"t-left-pdata>>" と "t-right-pdata>>" はエイリアス化されます。 このため、エイリアシングサポート アルゴリズムは、最終的に完全なポインターに到達する可能性があるすべてのポインター (一意のポインターと参照ポインターを含む) に従う必要があります。

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

関連項目

配列

配列とポインター

配列とSized-Pointer属性

MIDL 基本型

コールバック (callback)

const

context_handle

Enum

first_is

処理

インターフェイス定義 (IDL) ファイル

無視

last_is

length_is

地元の

max_is

pointer_default

参考

size_is

string

構造 体

switch_type

transmit_as

連合

unique