RPC-Vereinigungen
Sowohl gekapselte als auch nicht gekapselte Gewerkschaften teilen ein gemeinsames union_arm_selector<> Format:
union_arms<2>
arm1_case_value<4> offset_to_arm_description<2>
..
armN_case_value<4> offset_to_arm_description<2>
default_arm_description<2>
Das feld union_arms<2> besteht aus zwei Teilen. Wenn es sich bei der Union um eine Union im Format MIDL 1.0 handelt, enthalten die oberen 4 Bit die Ausrichtung des Unionsarms (Ausrichtung des größten ausgerichteten Arms). Andernfalls sind die oberen 4 Bit null. Die unteren 12 Bit enthalten die Anzahl der Arme in der Union. Mit anderen Worten,:
alignment<highest nibble> arm_counter<three lower nibbles>
Die felder offset_to_arm_description<2> enthalten einen relativ signierten Offset zur Beschreibung des Armtyps. Das Feld wird jedoch mit Optimierung für einfache Typen überladen. Für diese ist das obere Byte dieses Offsetfelds FC_MAGIC_UNION_BYTE (0x80) und das untere Byte der Kurzen ist der tatsächliche Formatzeichentyp des Arms. Daher gibt es zwei Bereiche für die Offsetwerte: "80 xx" bedeutet, dass xx eine Typformatzeichenfolge ist; und alles andere innerhalb des Bereichs (80 FF .. 7f FF) bedeutet einen tatsächlichen Offset. Dadurch wird der Abstand zwischen dem Bereich <80 00 .. 80 FF > als Offsets nicht verfügbar. Der Compiler überprüft, ob die MIDL-Version 5.1.164 verwendet wird.
Das Feld default_arm_description<2> gibt den Typ des Vereinigungsarms für den Standardarm an, falls vorhanden. Wenn für die Union kein Standardarm angegeben ist, wird das feld default_arm_description<2> 0xFFFF und eine Ausnahme ausgelöst, wenn der switch_is Wert keinem der Arm-Groß-/Kleinschreibungswerte entspricht. Wenn der Standardarm angegeben, aber leer ist, ist das default_arm_description<2> Feld null. Andernfalls weist das feld default_arm_description<2> dieselbe Semantik wie die offset_to_arm_description<2> Felder auf.
Es folgt eine Zusammenfassung:
- 0 – leerer Standardwert
- FFFF - kein Standard
- 80xx - einfacher Typ
- andere - relativer Offset
Gekapselte Gewerkschaften
Eine gekapselte Union stammt aus einer speziellen Unionsyntax in IDL. Effektiv ist eine gekapselte Vereinigung eine Bündelstruktur mit einem diskriminanten Feld am Anfang der Struktur und der Vereinigung als einziges anderes Mitglied.
FC_ENCAPSULATED_UNION switch_type<1>
memory_size<2>
union_arm_selector<>
Ein gekapseltes Switch_type<1> Feld der Union weist zwei Teile auf. Der untere Nibble stellt den tatsächlichen Switchtyp bereit, und der obere Nibble stellt den Speicherschritt bereit, um einen Schritt darüber zu führen, der eine Menge ist, die der Speicherzeiger erhöht werden muss, um über das feld switch_is hinauszuspringen, das alle Abstände zwischen dem switch_is()-Feld der stub-konstruierten Struktur und dem tatsächlichen Unionsfeld enthält.
Das feld memory_size<2> ist nur die Größe der Gewerkschaft und ist identisch mit nicht gekapselten Gewerkschaften. Um die Gesamtgröße der Struktur zu erhalten, die die Vereinigung enthält, fügen Sie memory_size<2> hinzu, um den Speicherschritt zu erhöhen, d. h. zum oberen Nibble des felds switch_type<1>, und richten Sie dann nach der Ausrichtung entsprechend der Inkrementierung aus.
Nicht gekapselte Vereinigungen
Eine nicht gekapselte Vereinigung ist eine typische Situation, in der eine Union ein Argument oder Feld ist und der Schalter ein anderes Argument bzw. feld ist.
FC_NON_ENCAPSULATED_UNION switch_type<1>
switch_is_description<>
offset_to_size_and_arm_description<2>
Wo:
Das feld switch_type<1> ist ein Formatzeichen für den Diskriminanten.
Das feld switch_is_descriptor<> ist ein Korrelationsdeskriptor und hat 4 oder 6 Byte, je nachdem, ob /robust verwendet wird. Wenn die Vereinigung jedoch in eine Struktur eingebettet ist, ist das Offsetfeld des switch_is_description<> für die switch_is_description<>der Offset des switch_is Felds von der Position der Union in der Struktur (nicht vom Anfang der Struktur).
Das Feld offset_to_size_and_arm_description<2> gibt den Abstand zur Größe und Armbeschreibung der Union, die mit der für gekapselten Gewerkschaften identisch ist und von allen nicht gekapselten Gewerkschaften desselben Typs geteilt wird:
memory_size<2>
union_arm_selector<>