Tipi di puntatore predefiniti
I puntatori non devono avere una descrizione esplicita dell'attributo. Quando non viene specificato un attributo esplicito, il compilatore MIDL usa un attributo puntatore predefinito.
I casi predefiniti per i puntatori senza attributi sono i seguenti:
- Puntatori di primo livello visualizzati negli elenchi di parametri per impostazione predefinita [ref] puntatori.
- Per impostazione predefinita, tutti gli altri puntatori sono il tipo specificato dall'attributo [pointer_default] . Quando non viene fornito alcun attributo [pointer_default] , questi puntatori sono l'attributo [ univoco ] quando il compilatore MIDL è in modalità Microsoft Extensions o l'attributo [ptr] quando il compilatore MIDL è in modalità compatibile con DCE.
Quando una routine remota restituisce un puntatore, il valore restituito deve essere un puntatore [ univoco ] o 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.
}
Osservazioni
Per garantire un comportamento univoco dell'attributo puntatore, usare sempre attributi puntatore espliciti quando si definisce un puntatore.
È consigliabile usare [ptr] solo quando è necessario l'aliasing del puntatore.