Freigeben über


User-Marshal

Der Benutzermarsal weist eine Formatzeichenfolge auf, die transmit_as ähnelt:

FC_USER_MARSHAL
flags<1>
quadruple_index<2>
user_type_memory_size<2>
transmitted_type_buffer size<2>
offset_to_the_transmitted_type<2>

Die Flags<1> Byte bestehen aus dem oberen Flag-Nibble und dem unteren Ausrichtungsknabbel.

Die oberen 2 Bits des Flag-Nibbles werden verwendet, um zu beschreiben, ob der Drahttyp als eindeutiger Zeiger, Referenzzeiger oder kein Zeiger definiert ist (es kann kein Ptr sein). Die folgenden Manifeste wurden definiert, um die Flags festzulegen/abzurufen:

#define USER_MARSHAL_UNIQUE         0x80
#define USER_MARSHAL_REF            0x40
#define USER_MARSHAL_POINTER        0xc0  /* unique or ref */
#define USER_MARSHAL_IID            0x20  /* JIT compiler only */

Die Ausrichtung des Kennzeichenworts hält die Drahtausrichtung des übertragenen Typs.

Die quadruple_index<2> ist ein Index des vierfachen Rückrufroutine der Benutzermarsalfunktionen. Die Routinepositionen sind wie folgt: Größenanpassung, Marshalling, Unmarshaling und Freisetzen von Routinen.

Die user_type_memory_size<2> stellt eine Größe für den benutzerspezifischen Typ bereit, einschließlich unbekannter Typen.

Die transmitted_type_buffer_size<2> ist entweder null, wenn die Größe variiert oder die tatsächliche feste Größe. Dies ist eine Optimierung, mit der MIDL Rückrufe beim Skalieren des Puffers und auch beim Freigeben überspringen kann.

Bereich

Die [Bereich]-Überprüfung bietet zusätzliche Mittel für die Argumentüberprüfung auf der NDR-Ebene. Der [Bereich]-Deskriptor weist das folgende Format auf:

FC_RANGE,   flags_type <1>
low value<4>
high value<4>

Die Flaggen nehmen den oberen Nibble und geben den unteren Nibble des zweiten Byte ein. Die niedrigen und hohen Werte hängen vom Typ der zu überprüfenden Variablen ab.

Die Flaggen sind als Erweiterungsfahrzeug vorgesehen; Der Compiler hat den Nibble auf Null festgelegt.