Aracılığıyla paylaş


RPC birleşimleri

Hem kapsüllenmiş hem de boşta olmayan birleşimler ortak bir union_arm_selector<> biçimini paylaşır:

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>

union_arms<2> alanı iki bölümden oluşur. Birleşim BIR MIDL 1.0 stil birleşimi ise, üst 4 bit birleşim kolunun hizalamasını içerir (en büyük hizalanmış kolun hizalaması). Aksi takdirde üst 4 bit sıfırdır. Alttaki 12 bit, birleşimdeki kol sayısını içerir. Başka bir deyişle:

alignment<highest nibble> arm_counter<three lower nibbles>

offset_to_arm_description<2> alanları, kolun tür açıklamasına göre imzalı bir uzaklık içerir. Ancak, alanı basit türler için iyileştirme ile aşırı yüklenmiştir. Bunlar için, bu uzaklık alanının üst baytı FC_MAGIC_UNION_BYTE (0x80) ve kısa olan alt bayt ise kolun gerçek biçim karakter türüdür. Bu nedenle, uzaklık değerleri için iki aralık vardır: "80 xx", xx bir tür biçimi dizesi olduğu anlamına gelir; ve aralıktaki diğer her şey (80 FF .. 7f FF) gerçek bir uzaklık anlamına gelir. Bu, <80 00 aralığından uzaklık yapar. 80 FF > uzaklık olarak kullanılamaz. Derleyici, MIDL sürüm 5.1.164 itibarıyla bunu denetler.

default_arm_description<2> alanı, varsa varsayılan kolun birleşim kolunun türünü belirtir. Birleşim için varsayılan bir arm belirtilmemişse, default_arm_description<2> alanı 0xFFFF ve switch_is değeri arm case değerlerinden herhangi biriyle eşleşmiyorsa bir özel durum oluşturulur. Varsayılan kol belirtilir ancak boşsa, default_arm_description<2> alanı sıfır olur. Aksi takdirde default_arm_description<2> alanı, offset_to_arm_description<2> alanlarıyla aynı semantiklere sahiptir.

Özet aşağıdadır:

  • 0 - boş varsayılan
  • FFFF - varsayılan yok
  • 80xx - basit tür
  • diğer - göreli uzaklık

Kapsüllenmiş Birleşimler

Kapsüllenmiş birleşim, IDL'deki özel bir birleşim söz diziminden gelir. Etkili bir şekilde, kapsüllenmiş birleşim, yapının başında ayrımcı bir alan ve diğer tek üye olarak birleşim içeren bir paket yapısıdır.

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

Kapsüllenmiş bir birleşimin switch_type<1> alanının iki bölümü vardır. Alt nibble gerçek anahtar türünü sağlar ve üst nibble, bellek işaretçisinin switch_is alanını atlamak için artırılması gereken ve saplama tarafından oluşturulan yapının switch_is() alanı ile gerçek birleşim alanı arasındaki doldurmayı içeren bir miktarın üzerine geçmek için bellek artışını sağlar.

memory_size<2> alanı yalnızca birleşimin boyutudur ve boş birleşimlerle aynıdır. Birleşimi içeren yapının toplam boyutunu elde etmek için, 2> bellek artışına memory_size<2> ekleyerek bu değeri switch_type<1> alanının üst parçasına ekleyin ve ardından artışa karşılık gelen hizalamaya göre hizalayın.

Atılmış Birleşimler

Olmayan birleşim, birleşimin bir bağımsız değişken veya alan olduğu ve anahtarın sırasıyla başka bir bağımsız değişken veya alan olduğu tipik bir durumdur.

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

Nerede:

switch_type<1> alanı, ayrımcı için bir biçim karakteridir.

switch_is_descriptor<> alanı bir bağıntı tanımlayıcısıdır ve /strong kullanılıp kullanılmadığına bağlı olarak 4 veya 6 bayttır. Ancak, switch_is_description<>için birleşim bir yapıya katıştırılmışsa, switch_is_description<> uzaklık alanı, birleşimin yapıdaki konumundan (yapının başlangıcından değil) switch_is alanına uzaklıktır.

offset_to_size_and_arm_description<2> alanı, birleşimin boyutuna ve kol açıklamasına uzaklığı verir. Bu, kapsüllenmiş birleşimler için de aynıdır ve aynı türdeki tüm ayrıştırılmış birleşimler tarafından paylaşılır:

memory_size<2> 
union_arm_selector<>