Związki RPC
Zarówno hermetyzowane, jak i nie hermetyzowane związki mają wspólny format 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> składa się z dwóch części. Jeśli związek jest unii w stylu MIDL 1.0, górne 4 bity zawierają wyrównanie ramienia unii (wyrównanie największego wyrównanego ramienia). W przeciwnym razie górne 4 bity są zerowe. Dolne 12 bitów zawierają liczbę ramion w unii. Innymi słowy:
alignment<highest nibble> arm_counter<three lower nibbles>
Pola offset_to_arm_description<2> zawierają względne przesunięcie ze znakiem do opisu typu ramienia. Jednak pole jest przeciążone optymalizacją dla prostych typów. W tym przypadku górny bajt tego pola przesunięcia jest FC_MAGIC_UNION_BYTE (0x80), a dolny bajt krótkiego to rzeczywisty typ znaku formatu ramienia. W związku z tym istnieją dwa zakresy wartości przesunięcia: "80 xx" oznacza, że xx jest ciągiem formatu typu; i wszystkie inne elementy w zakresie (80 FF .. 7f FF) oznacza rzeczywiste przesunięcie. Dzięki temu przesunięcia z zakresu <80 00 .. 80 FF > niedostępne jako przesunięcia. Kompilator sprawdza, czy w wersji MIDL w wersji 5.1.164.
Pole default_arm_description<2> wskazuje typ ramienia unii dla domyślnego ramienia, jeśli istnieje. Jeśli nie określono domyślnego ramienia dla unii, pole default_arm_description<2> jest 0xFFFF i zgłaszany jest wyjątek, jeśli wartość switch_is nie jest zgodna z żadnymi wartościami wielkości liter arm. Jeśli wartość domyślna ramienia jest określona, ale jest pusta, pole default_arm_description<2> ma wartość zero. W przeciwnym razie pole default_arm_description<2> ma te same semantyki co pola offset_to_arm_description<2>.
Poniżej przedstawiono podsumowanie:
- 0 — puste ustawienie domyślne
- FFFF — brak wartości domyślnej
- 80xx — prosty typ
- inne — przesunięcie względne
Hermetyzowane związki
Hermetyzowana unia pochodzi ze specjalnej składni unii w języku IDL. W rzeczywistości hermetyzowana unia jest strukturą pakietu z rozdysponowanym polem na początku struktury i unii jako jedyny inny element członkowski.
FC_ENCAPSULATED_UNION switch_type<1>
memory_size<2>
union_arm_selector<>
Hermetyzowane pole unii switch_type<1> ma dwie części. Dolna nibble zapewnia rzeczywisty typ przełącznika, a górna nibble zapewnia przyrost pamięci, który jest ilością, którą wskaźnik pamięci musi być zwiększany, aby pominąć obok pola switch_is, który obejmuje wszelkie wypełnienie między polem switch_is() struktury skonstruowanej wycinkami i rzeczywistym polem unii.
Pole memory_size<2> jest wielkością tylko unii i jest identyczne z nieu hermetyzowanym związkiem. Aby uzyskać całkowity rozmiar struktury, która zawiera unię, dodaj memory_size<2> do przyrostu pamięci, czyli do górnego nibble pola switch_type<1>, a następnie wyrównaj według wyrównania odpowiadającego przyrostowi.
Nie hermetyzowane związki
Niezwiązana unia jest typową sytuacją, w której unia jest jednym argumentem lub polem, a przełącznik jest odpowiednio innym argumentem lub polem.
FC_NON_ENCAPSULATED_UNION switch_type<1>
switch_is_description<>
offset_to_size_and_arm_description<2>
Gdzie:
Pole switch_type<1> jest znakiem formatu dla dyskryminatora.
Pole switch_is_descriptor<> jest deskryptorem korelacji i ma 4 lub 6 bajtów w zależności od tego, czy /robust jest używany. Jednak w przypadku switch_is_description<>, jeśli związek jest osadzony w strukturze, pole przesunięcia switch_is_description<> jest przesunięciem do pola switch_is z pozycji unii w strukturze (nie od początku struktury).
Pole offset_to_size_and_arm_description<2> daje przesunięcie do rozmiaru i opisu ramienia unii, który jest identyczny z opisem hermetyzowanym i jest współużytkowany przez wszystkie związki inne niż hermetyzowane o tym samym typie:
memory_size<2>
union_arm_selector<>