RPC-Unions

Gekapselte und nicht kapselte Unions verwenden einen gemeinsamen Union-Arm-Selektor _ _<> 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>

Die _ Union-<2> besteht aus zwei Teilen. Wenn die Union eine Union im MIDL 1.0-Stil ist, enthalten die oberen 4 Bits die Ausrichtung des Union-Arms (Ausrichtung des größten ausgerichteten Arms). Andernfalls sind die oberen 4 Bits 0 (null). Die unteren 12 Bits enthalten die Anzahl der Arme in der Union. Anders gesagt:

alignment<highest nibble> arm_counter<three lower nibbles>

Die _ Offset-zu-Arm-Beschreibung<2> Felder enthalten einen relativen Offset mit Vorsigniertem zur _ _ Typbeschreibung des Arms. 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 des Shorts 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 werden Offsets aus dem Bereich <80 00 . 80 FF > als Offsets nicht verfügbar. Der Compiler überprüft dies ab MIDL-Version 5.1.164.

Die standarde Armbeschreibung<2> feld gibt den Typ des Union-Arms für den _ _ Standard-ARM an( sofern dies der Fall ist). Wenn kein Standardarm für die Union angegeben ist, wird die Standardbeschreibung des Arms _<2>-Feld 0xFFFF und eine Ausnahme wird ausgelöst, wenn der Schalter wert ist, nicht mit einem der Arm-Case-Werte _ _ überein. Wenn der Standardarm angegeben, aber leer ist, ist die Standardbeschreibung<_ _ 2,> Feld null ist. Andernfalls hat die standarde Armbeschreibung<2>-Feld dieselbe Semantik wie der Offset für die Armbeschreibung<2> _ _ _ _ _ Felds.

Im Folgenden finden Sie eine Zusammenfassung:

  • 0 – leerer Standardwert
  • FFFF – keine Standardeinstellung
  • 80xx – einfacher Typ
  • other – relativer Offset

Gekapselte Unions

Eine gekapselte Union stammt aus einer speziellen Unionsyntax in IDL. Effektiv ist eine gekapselte Union eine Bündelstruktur mit einem diskriminanten Feld am Anfang der Struktur und der Union als einziger anderer Member.

FC_ENCAPSULATED_UNION switch_type<1> 
memory_size<2>
union_arm_selector<>

Der Switchtyp einer gekapselten Union _<1> aus zwei Teilen. Der untere Nibble stellt den tatsächlichen Switchtyp zur Verfügung, und der obere Nibble stellt das Arbeitsspeicherinkrement zur Verfügung, das überschritten werden muss. Dies ist eine Menge, die der Speicherzeiger erhöht werden muss, um über das Feld switch is hinaus zu überspringen. Dies schließt alle Paddings zwischen dem switch is()-Feld der stub-konstruierten Struktur und dem tatsächlichen _ _ Union-Feld ein.

Die Arbeitsspeichergröße<2> ist nur die Größe der Union und identisch mit nicht _ kapselten Unions. To obtain the total size of the structure that contains the union, add memory_size<2> to memory increment to step over, that is to the upper nibble of the switch_type<1> field, then align by the alignment corresponding to the increment.

Nicht kapselte Unions

Eine nicht kapselte Union ist eine typische Situation, in der eine Union ein Argument oder Feld 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>

Hierbei gilt:

Der _ Schaltertyp<1> ist ein Formatzeichen für den Diskriminanten.

Der Schalter _ ist deskriptor,<> feld ein Korrelationsdeskriptor ist und je nachdem, ob /robust verwendet wird, 4 oder _ 6 Bytes hat. Für den Schalter ist jedoch description<>. Wenn die Union in eine Struktur eingebettet ist, ist das Offsetfeld des Schalters description<> ist der Offset zum Schalter ist feld von der Position der Union in der Struktur (nicht vom Anfang der _ _ _ _ _ Struktur).

Der Offset zu Größe und die Armbeschreibung _ _<_ _ _ 2>-Feld geben den Offset zur Größe der Union und der Armbeschreibung an, die mit der für gekapselte Unions identisch ist und von allen nicht kapselten Unions desselben Typs gemeinsam genutzt wird:

memory_size<2> 
union_arm_selector<>