RPC 等位
封裝和非capsulated 等位都會共用一般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>
union_arms<2> 字段包含兩個部分。 如果聯集是 MIDL 1.0 樣式聯集,則上方 4 位包含聯集臂的對齊方式(對齊最大對齊臂的對齊方式)。 否則,前4位為零。 較低的12位包含等位中的臂數。 換句話說:
alignment<highest nibble> arm_counter<three lower nibbles>
offset_to_arm_description<2 個> 欄位包含 arm 類型描述的相對帶正負號位移。 不過,欄位會多載簡單類型的優化。 針對這些,此位移欄位元的上一個字節是FC_MAGIC_UNION_BYTE(0x80),而short的下位元組是arm的實際格式字元類型。 因此,位移值有兩個範圍:“80 xx” 表示 xx 是類型格式字串:和範圍內其他所有專案 (80 FF .. 7f FF) 表示實際位移。 這會讓從範圍 <80 00 的位移。 80 FF > 無法使用作為位移。 編譯程式會檢查從 MIDL 5.1.164 版開始。
default_arm_description<2> 字段會指出預設臂的等位臂類型,如果有的話。 如果沒有指定聯集的預設arm,則會0xFFFF default_arm_description<2> 欄位,如果switch_is值不符合任何arm大小寫值,則會引發例外狀況。 如果指定預設arm但空白,則default_arm_description<2> 字段為零。 否則,default_arm_description<2> 欄位的語意與 offset_to_arm_description<2> 字段相同。
以下是摘要:
- 0 - 空白預設值
- FFFF - 無預設值
- 80xx - 簡單類型
- other - 相對位移
封裝聯集
封裝聯集來自IDL中的特殊等位語法。 實際上,封裝聯集是結構開頭具有辨別欄位的配套結構,而聯集是唯一的另一個成員。
FC_ENCAPSULATED_UNION switch_type<1>
memory_size<2>
union_arm_selector<>
封裝聯集的 switch_type<1> 欄位有兩個部分。 較低的nibble提供實際的參數類型,而上方的Nibble提供記憶體遞增來逐步執行,也就是必須遞增記憶體指標以略過switch_is欄位的數量,其中包含存根結構之 switch_is() 欄位與實際等位欄位之間的任何填補。
memory_size<2> 字段只是等位的大小,而且與非capsulated 等位相同。 若要取得包含等位的結構大小總計,請將memory_size<2> 新增至記憶體遞增以逐步執行,也就是switch_type<1> 欄位的上邊,然後對齊對應至遞增的對齊方式。
非capsulated Unions
非capsulated 等位是一般情況,其中聯集是一個自變數或欄位,而參數則是另一個自變數或字段。
FC_NON_ENCAPSULATED_UNION switch_type<1>
switch_is_description<>
offset_to_size_and_arm_description<2>
哪裡:
switch_type<1> 字段是辨別項的格式字元。
switch_is_descriptor<>字段是相互关联描述元,而且根據是否使用 /robust,具有 4 或 6 個字節。 不過,對於 switch_is_description<>而言,如果聯集內嵌在 結構中,則switch_is_description<>的位移字段是结构中联集位置的 switch_is位移(不是結構開頭)。
offset_to_size_and_arm_description<2> 字段會提供等位到等位的大小和臂描述,這與封裝聯集的位移相同,且由相同類型的所有非capsulated 等位共用:
memory_size<2>
union_arm_selector<>