Zeiger (RPC)

Allgemeine Zeiger

Ein allgemeiner Zeiger wird als alles andere als Schnittstellenzeiger und Byteanzahlzeiger definiert.

Es gibt zwei mögliche Layouts für die Beschreibung:

pointer_type<1> pointer_attributes<1>
simple_type<1> FC_PAD

– oder –

pointer_type<1> pointer_attributes<1>
offset_to_complex_description<2>

Das erste Format wird verwendet, wenn der Zeiger ein Zeiger auf einen einfachen Typ oder einen nicht großen Zeichenfolgenzeiger ist. Das zweite Format wird für Zeiger auf alle anderen Typen verwendet. Zeigerattribute geben mit dem flag FC_SIMPLE_POINTER an, welches Beschreibungslayout es ist.

<pointer_type 1> ist einer der folgenden:

Formatieren von Zeichen BESCHREIBUNG
FC_RP Ein Verweiszeiger.
FC_UP Ein eindeutiger Zeiger.
FC_FP Ein vollständiger Zeiger.
FC_OP Ein eindeutiger Zeiger in einer Objektschnittstelle.

 

Der Grund, FC_OP zu unterscheiden, ist semantisch: In Objektschnittstellen sollte ein [in,out]-Zeiger freigegeben werden, bevor ein neues Objekt getrennt und ein neuer Zeigerwert zugewiesen wird.

<Pointer_attributes 1> kann eines der in der folgenden Tabelle gezeigten Flags aufweisen.

attribute Flag BESCHREIBUNG
01 FC_ALLOCATE_ALL_NODES Der Zeiger ist Teil eines Zuordnungsschemas (all_nodes).
02 FC_DONT_FREE Ein allocate(dont_free)-Zeiger.
04 FC_ALLOCED_ON_STACK Ein Zeiger, dessen Referent auf dem Stapel des Stubs zugeordnet ist.
08 FC_SIMPLE_POINTER Ein Zeiger auf einen einfachen Typ oder eine nicht konforme Zeichenfolge. Dieses festgelegte Flag gibt das Layout der Zeigerbeschreibung als das oben beschriebene einfache Zeigerlayout an, andernfalls wird das Deskriptorformat mit dem Offset angegeben.
10 FC_POINTER_DEREF Ein Zeiger, der dereferenziert werden muss, bevor der Zeigerreferent behandelt wird.

 

Zeiger, auf die size_is(), max_is(), length_is(), last_is() und/oder first_is() angewendet wurden, weisen Formatzeichenfolgenbeschreibungen auf, die mit einem Zeiger auf ein Array des entsprechenden Typs identisch sind (z. B. ein konformes Array, wenn size_is() angewendet wird, und ein konformes unterschiedliches Array, wenn size_is() und length_is angewendet werden).

Schnittstellenzeiger

Eine Objektschnittstellenzeigerformatzeichenfolge hat eines von zwei Formaten, je nachdem, ob die entsprechende IID dem Compiler bekannt ist.

Ein Schnittstellenzeiger mit einer konstanten IID hat die folgende Beschreibung:

FC_IP FC_CONSTANT_IID 
iid<16>

Der iid<16-Teil> ist die tatsächliche IID für den Schnittstellenzeiger. Die iid wird in einem Format in die Formatzeichenfolge geschrieben, das mit der GUID-Datenstruktur identisch ist: long, short, short, char [8].

Die Beschreibung eines Schnittstellenzeigers, auf den iid_is() angewendet wird, lautet:

FC_IP FC_PAD 
iid_description<> 

Der iid_description<> ist ein Korrelationsdeskriptor und hat 4 oder 6 Bytes, je nachdem, ob /robust verwendet wird. Der von der NdrComputeConformance-Funktion berechnete Wert ist der IID-Zeiger.

Byteanzahl Zeiger

Byteanzahlzeiger beziehen sich auf ein spezielles Optimierungsattribut namens [byte_count]. Es werden die folgenden Formate verwendet:

FC_BYTE_COUNT_POINTER 
simple_type<1>
byte_count_description<> 

–Und–

FC_BYTE_COUNT_POINTER 
FC_PAD
byte_count_description<> 
pointee_description<>

Die byte_count_description<> ist ein Korrelationsdeskriptor und verfügt über 4 oder 6 Bytes, je nachdem, ob /robust verwendet wird.

Die pointee_description<> ist eine Beschreibung des Pointee-Typs.