Sdílet prostřednictvím


Sjednocení RPC

Zapouzdřené i necapsulované sjednocení sdílejí společný formát union_arm_selector<>:

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>

Pole union_arms<2> se skládá ze dvou částí. Pokud je sjednocení midL 1.0 sjednocení, horní 4 bity obsahují zarovnání sjednocovacího ramena (zarovnání největší zarovnané rameno). V opačném případě jsou horní 4 bity nula. Nižších 12 bitů obsahuje počet zbraní ve sjednocení. Jinými slovy:

alignment<highest nibble> arm_counter<three lower nibbles>

Pole offset_to_arm_description<2> obsahují relativní posun se msměrným posunem na popis typu arm. Pole je však přetížené optimalizací pro jednoduché typy. Horní bajt tohoto pole posunu je FC_MAGIC_UNION_BYTE (0x80) a dolní bajt krátkého bajtu je skutečný typ znaku formátu ramene. Pro hodnoty posunu existují dva rozsahy: "80 xx" znamená, že xx je řetězec formátu typu; a vše ostatní v rozsahu (80 FF .. 7f FF) znamená skutečný posun. Tím se posuny z rozsahu <80 00 .. 80 FF > jako posuny nedostupné. Kompilátor zkontroluje, že od MIDL verze 5.1.164.

Pole default_arm_description<2> označuje typ sjednocovacího ramena pro výchozí rameno( pokud existuje). Pokud pro sjednocování není zadána žádná výchozí arm, pole default_arm_description<2> je 0xFFFF a pokud hodnota switch_is neodpovídá žádné hodnotě případů arm, vyvolá se výjimka. Pokud je zadána výchozí arm, ale je prázdná, pak pole default_arm_description<2> je nula. V opačném případě pole default_arm_description<2> má stejnou sémantiku jako pole offset_to_arm_description<2>.

Následuje souhrn:

  • 0 – výchozí hodnota je prázdná.
  • FFFF – bez výchozího nastavení
  • 80xx – jednoduchý typ
  • jiné – relativní posun

Zapouzdřené sjednocení

Zapouzdřená sjednocení pochází ze speciální syntaxe sjednocení v IDL. Zapouzdřená sjednocení je struktura svazku s diskriminantní pole na začátku struktury a sjednocení jako jediný druhý člen.

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

Zapouzdřené pole sjednocení switch_type<1> má dvě části. Nižší nibble poskytuje skutečný typ přepínače a horní nibble poskytuje přírůstek paměti pro krok nad tím, že je nutné zvýšit ukazatel paměti, aby se přeskočí přes switch_is pole, které zahrnuje jakékoli odsazení mezi polem switch_is() vytvořené struktury zástupných procedur a skutečným sjednocovacího pole.

Pole memory_size<2> je pouze velikost sjednocení a je shodná s necapsulovanými sjednoceními. Chcete-li získat celkovou velikost struktury, která obsahuje sjednocení, přidejte memory_size<2> do paměti přírůstku, tj. na horní nibble switch_type<1> pole a pak zarovnejte zarovnání odpovídající přírůstku.

Nekapucené sjednocení

Nekapouzdřená sjednocení je typická situace, kdy je sjednocování jeden argument nebo pole a přepínač je jiný argument nebo pole.

FC_NON_ENCAPSULATED_UNION switch_type<1> 
switch_is_description<>
offset_to_size_and_arm_description<2>

Kde:

Pole switch_type<1> je formátovací znak pro diskriminant.

Pole switch_is_descriptor<> je popisovač korelace a má 4 nebo 6 bajtů v závislosti na tom, jestli se používá /robustní. U switch_is_description<>však pokud je sjednocení vloženo do struktury, posun pole switch_is_description<> je posun na switch_is pole z pozice sjednocení ve struktuře (nikoli od začátku struktury).

Pole offset_to_size_and_arm_description<2> poskytuje posun na velikost a popis ramene sjednocení, který je stejný jako u zapouzdřených sjednocení a je sdílen všemi nekapitulovanými sjednoceními stejného typu:

memory_size<2> 
union_arm_selector<>