Поделиться через


Типы указателей по умолчанию

Указатели не требуют явного описания атрибута. Если явный атрибут не указан, компилятор MIDL использует атрибут указателя по умолчанию.

Варианты по умолчанию для неатрибуированных указателей приведены ниже.

  • Указатели верхнего уровня, отображаемые в списках параметров, по умолчанию — [ссылочные] указатели.
  • Все остальные указатели по умолчанию заданы атрибутом [pointer_default] . Если атрибут [pointer_default] не указан, эти указатели по умолчанию используют атрибут [уникальные] при использовании компилятора MIDL в режиме расширениях Майкрософт или атрибуте [ptr] при использовании компилятора MIDL в режиме совместимости с DCE.

Когда удаленная процедура возвращает указатель, возвращаемое значение должно быть указателем [уникальным] или полным ([ 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] только в том случае, если требуется псевдоним указателя.