RPC 等位
封裝和非擷取聯集都會共用通用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 位會包含等位 arm 的對齊方式, (對齊最大對齊的 arm) 。 否則,前 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 的等位 arm 類型,如果有的話。 如果沒有為等位指定預設 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 - 簡單類型
- 其他 - 相對位移
封裝的等位來自 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 > 欄位是唯一的等位大小,且與非擷取的等位相同。 若要取得包含等位的結構大小總計,請將memory_size < 2 > 新增至記憶體遞增以逐步執行,也就是switch_type 1 > 欄位的 < 上方 Nibble,然後對齊對應至遞增的對齊方式。
非擷取聯集是一般情況,其中聯集是一個引數或欄位,而參數則是另一個引數或欄位。
FC_NON_ENCAPSULATED_UNION switch_type<1>
switch_is_description<>
offset_to_size_and_arm_description<2>
其中:
switch_type < 1 > 欄位是辨別字元的格式字元。
switch_is_descriptor <> 欄位是相互關聯描述元,且有 4 或 6 個位元組,視是否使用 /robust 而定。 不過,針對switch_is_description <> ,如果聯集內嵌在結構中,則switch_is_description <> 的位移欄位是結構中switch_is欄位的位移, (不是從結構開頭) 。
offset_to_size_and_arm_description < 2 > 欄位會提供等位大小和 arm 描述的位移,這與封裝等位的位移相同,而且會由相同類型的所有非擷取聯集共用:
memory_size<2>
union_arm_selector<>