Типы указателей по умолчанию
Указатели не требуют явного описания атрибута. Если явный атрибут не указан, компилятор 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] только в том случае, если требуется псевдоним указателя.