Types de pointeurs par défaut

Les pointeurs ne sont pas obligatoires pour avoir une description d’attribut explicite. Lorsqu’aucun attribut explicite n’est fourni, le compilateur MIDL utilise un attribut de pointeur par défaut.

Les cas par défaut pour les pointeurs non distribués sont les suivants :

  • Les pointeurs de niveau supérieur qui apparaissent dans les listes de paramètres sont par défaut des pointeurs [ref].
  • Tous les autres pointeurs sont définis par défaut sur le type spécifié par l’attribut [pointer_default]. Quand aucun attribut [pointer_default] n’est fourni, ces pointeurs sont par défaut l’attribut [ unique ] lorsque le compilateur MIDL est en mode Extensions Microsoft ou l’attribut [ptr] lorsque le compilateur MIDL est en mode compatible DCE.

Lorsqu’une procédure distante retourne un pointeur, la valeur de retour doit être un pointeur [ unique ] ou complet ([ 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.    
}

Notes

Pour garantir un comportement non ambigu entre pointeur et attribut, utilisez toujours des attributs de pointeur explicites lors de la définition d’un pointeur.

Il est recommandé d’utiliser [ptr] uniquement lorsque l’alias de pointeur est requis.