既定のポインター型

明示的な属性の説明を持つポインターは必要ありません。 明示的な属性が指定されていない場合、MIDL コンパイラは既定のポインター属性を使用します。

属性が設定されていないポインターの既定のケースは次のとおりです。

  • パラメーター リストに表示される最上位のポインターは、既定で [ref] ポインターです。
  • その他のすべてのポインターは、既定で [pointer_default] 属性で指定された型に設定されます。 [pointer_default] 属性が指定されていない場合、MIDL コンパイラが Microsoft Extensions モードの場合は [unique ] 属性、MIDL コンパイラが DCE 互換モードの場合は [ptr] 属性に既定でポインターが設定されます。

リモート プロシージャがポインターを返す場合、戻り値は [ unique ] または full ([ ptr ]) ポインターである必要があります。

/* IDL file compiled without /osf */
[ 
  uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
  version(1.0),
  pointer_default(ptr)
]
interface MyInterface
{
    typedef long *PLONG;
  
    struct MyCircularList {
        struct MyCircularList *pRight;
        struct MyCircularList *pLeft;
        long Data;
    };

    void Foo1( [in] PLONG p );                   // p is ref
 
    void Foo2( [in] struct MyCircularList *p );  // p is ref, p->pRight and p->pLeft is ptr

    struct MyCircularList *Foo3( void );         // returned pointer is ptr.    
}

[ 
  uuid(ba209999-0c6c-11d2-97cf-00c04f8eea46),
  version(1.0)
]
interface MyInterface2
{
    struct MySingleList
       {
       struct MySingleList *pNext;
       long Data;
       };
    void Foo4( [in] struct MySingleList *p );  // p is ref, p->pNext is unique

    struct MySingleList *Foo5( void );         // returned pointer is unique.    
}

解説

明確なポインター属性の動作を保証するには、ポインターを定義するときに常に明示的なポインター属性を使用します。

[ptr] は、ポインターのエイリアシングが必要な場合にのみ使用することをお勧めします。