Tipos de ponteiro padrão
Ponteiros não são necessários para ter uma descrição de atributo explícita. Quando um atributo explícito não é fornecido, o Compilador MIDL usa um atributo de ponteiro padrão.
Os casos padrão para ponteiros não atribuídos são os seguintes:
- Ponteiros de nível superior que aparecem em listas de parâmetros padrão para ponteiros [ref].
- Todos os outros ponteiros são padrão para o tipo especificado pelo atributo [pointer_default]. Quando nenhum atributo [pointer_default] é fornecido, esses ponteiros padrão para o atributo [ exclusivo ] quando o compilador MIDL está no modo extensões da Microsoft ou o atributo [ptr] quando o compilador MIDL está no modo compatível com DCE.
Quando um procedimento remoto retorna um ponteiro, o valor retornado deve ser um ponteiro [ exclusivo ] ou completo ([ 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.
}
Comentários
Para garantir um comportamento inequívoco de atributo de ponteiro, sempre use atributos de ponteiro explícitos ao definir um ponteiro.
É recomendável que [ptr] seja usado somente quando o aliasing de ponteiro for necessário.