Puntatori (RPC)
Un puntatore comune è definito come qualsiasi elemento diverso dai puntatori di interfaccia e dai puntatori al conteggio dei byte.
Per la descrizione sono disponibili due layout possibili:
pointer_type<1> pointer_attributes<1>
simple_type<1> FC_PAD
–o–
pointer_type<1> pointer_attributes<1>
offset_to_complex_description<2>
Il primo formato viene utilizzato se il puntatore è un puntatore a un tipo semplice o a un puntatore di stringa non ridimensionato. Il secondo formato viene usato per i puntatori a tutti gli altri tipi. Gli attributi del puntatore indicano il layout della descrizione con il flag FC_SIMPLE_POINTER.
pointer_type<1> è uno dei seguenti.
Formato carattere | Descrizione |
---|---|
FC_RP | Puntatore di riferimento. |
FC_UP | Puntatore univoco. |
FC_FP | Puntatore completo. |
FC_OP | Puntatore univoco in un'interfaccia oggetto. |
Il motivo per distinguere FC_OP è semantico: nelle interfacce oggetto, un puntatore [in,out] deve essere liberato prima di separare un nuovo oggetto e assegnare un nuovo valore del puntatore.
Pointer_attributes<1> può avere uno dei flag illustrati nella tabella seguente.
Attributo | Bandiera | Descrizione |
---|---|---|
01 | FC_ALLOCATE_ALL_NODES | Il puntatore fa parte di uno schema di allocazione allocato (all_nodes). |
02 | FC_DONT_FREE | Puntatore allocato (dont_free). |
04 | FC_ALLOCED_ON_STACK | Puntatore il cui referenziale viene allocato nello stack dello stub. |
08 | FC_SIMPLE_POINTER | Puntatore a un tipo semplice o a una stringa non conforme. Questo flag impostato indica il layout della descrizione del puntatore come layout del puntatore semplice descritto in precedenza; in caso contrario, viene indicato il formato del descrittore con l'offset. |
10 | FC_POINTER_DEREF | Puntatore che deve essere dereferenziato prima di gestire il referente del puntatore. |
I puntatori a cui sono applicati size_is(), max_is(), length_is(), last_is() e/o first_is() hanno descrizioni di stringhe di formato identiche a un puntatore a una matrice del tipo appropriato(ad esempio, una matrice conforme se size_is() viene applicata, una matrice variabile conforme se vengono applicati size_is() e length_is).
Una stringa di formato del puntatore a interfaccia oggetto ha uno dei due formati, a seconda che l'IID corrispondente sia noto al compilatore.
Un puntatore di interfaccia con un IID costante ha la descrizione seguente:
FC_IP FC_CONSTANT_IID
iid<16>
La parte iid<16> è l'IID effettivo per il puntatore all'interfaccia. L'iid viene scritto nella stringa di formato in un formato identico alla struttura dei dati GUID: long, short, short, char [8].
La descrizione di un puntatore a interfaccia con iid_is() applicata è:
FC_IP FC_PAD
iid_description<>
Il iid_description<> è un descrittore di correlazione e ha 4 o 6 byte a seconda che venga usato /robust. Il valore calcolato dalla funzione NdrComputeConformance è il puntatore IID.
I puntatori al conteggio dei byte sono correlati a un attributo di ottimizzazione speciale denominato [byte_count]. Vengono usati i formati seguenti:
FC_BYTE_COUNT_POINTER
simple_type<1>
byte_count_description<>
–e–
FC_BYTE_COUNT_POINTER
FC_PAD
byte_count_description<>
pointee_description<>
Il byte_count_description<> è un descrittore di correlazione e ha 4 o 6 byte a seconda che venga usato /robust.
Il pointee_description<> è una descrizione del tipo di puntatore.