使用英语阅读

通过


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 位包含联合臂的对齐方式 (最大对齐臂) 对齐。 否则,上限 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,则会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> 字段包含两个部分。 下角提供实际开关类型,而上位笔尖提供单步执行内存递增,即内存指针必须递增才能跳过switch_is字段,其中包括存根构造结构的 switch_is () 字段与实际联合字段之间的任何填充。

memory_size<2> 字段只是联合的大小,与非封装的联合相同。 若要获取包含联合的结构的总大小,请将 memory_size<2> 添加到内存增量以单步执行,即switch_type<1> 字段的上位,然后按与增量对应的对齐方式对齐。

非封装联合

非封装联合是一种典型情况,其中联合是一个参数或字段,开关是另一个参数或字段。

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<>