Types de pointeurs par défaut
Les pointeurs ne sont pas tenus d’avoir une description d’attribut explicite. Lorsqu’un attribut explicite n’est pas fourni, le compilateur MIDL utilise un attribut de pointeur par défaut.
Les cas par défaut pour les pointeurs non attribués sont les suivants :
- Pointeurs de niveau supérieur qui apparaissent dans les listes de paramètres par défaut [ref] pointeurs.
- 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 sur l’attribut [ unique ] lorsque le compilateur MIDL est en mode Microsoft Extensions 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.
}
Remarques
Pour garantir un comportement sans ambiguïté des attributs de pointeur, utilisez toujours des attributs de pointeur explicites lors de la définition d’un pointeur.
Il est recommandé d’utiliser [ptr] est utilisé uniquement lorsque l’alias de pointeur est requis.