Tipos de puntero predeterminados

No es necesario que los punteros tengan una descripción de atributo explícita. Cuando no se proporciona un atributo explícito, el compilador MIDL usa un atributo de puntero predeterminado.

Los casos predeterminados para punteros no distribuidos son los siguientes:

  • Punteros de nivel superior que aparecen en listas de parámetros de forma predeterminada a punteros [ref].
  • Todos los demás punteros se establece de forma predeterminada en el tipo especificado por el atributo [pointer_default]. Cuando no se proporciona ningún atributo [pointer_default], estos punteros tienen como valor predeterminado el atributo [ unique ] cuando el compilador MIDL está en modo De extensiones de Microsoft o el atributo [ptr] cuando el compilador MIDL está en modo compatible con DCE.

Cuando un procedimiento remoto devuelve un puntero, el valor devuelto debe ser un puntero [ unique ] o 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.    
}

Comentarios

Para garantizar un comportamiento de atributo de puntero no ambiguo, use siempre atributos de puntero explícitos al definir un puntero.

Se recomienda usar [ptr] solo cuando se requiere el alias de puntero.