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 フィールドは、2> つの部分で構成されます。 共用体が MIDL 1.0 スタイル共用体の場合、上位 4 ビットには共用体アームのアラインメント (最大アラインメント・アームのアラインメント) が含まれます。 それ以外の場合、上位 4 ビットは 0 です。 下位 12 ビットには、共用体内のアームの数が含まれます。 つまり、以下の要件が適用されます。
alignment<highest nibble> arm_counter<three lower nibbles>
offset_to_arm_description<2 フィールド> には、アームの型の説明に対する相対符号付きオフセットが含まれています。 ただし、フィールドは単純型の最適化でオーバーロードされます。 これらの場合、このオフセット フィールドの上位バイトはFC_MAGIC_UNION_BYTE (0x80) で、short の下位バイトは arm の実際の書式文字型です。 そのため、オフセット値には 2 つの範囲があります。"80 xx" は xx が型書式指定文字列であることを意味します。その他のすべてが範囲内 (80 FF .. 7f FF) の場合は、実際のオフセットを意味します。 これにより、範囲 <80 00 からのオフセットが作成されます。 オフセットとして 80 FF > を使用できません。 コンパイラは、MIDL バージョン 5.1.164 以降であることを確認します。
default_arm_description<2> フィールドは、既定の arm の共用体アームの種類 (存在する場合) を示します。 共用体に既定の arm が指定されていない場合、default_arm_description<2> フィールドは0xFFFFされ、switch_is値が arm ケース値のいずれにも一致しない場合は例外が発生します。 既定の arm が指定されていても空の場合、default_arm_description<2> フィールドは 0 になります。 それ以外の場合、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> フィールドには、2 つの部分があります。 下のニブルは実際のスイッチの種類を提供し、上のニブルは、スタブ構造のswitch_is() フィールドと実際の共用体フィールドの間のパディングを含む、switch_is フィールドをスキップするためにメモリ ポインターをインクリメントする必要がある量をステップオーバーするメモリインクリメントを提供します。
memory_size<2> フィールドは共用体のサイズのみであり、非カプセル化共用体と同じです。 共用体を含む構造体の合計サイズを取得するには、ステップ オーバーするメモリ 増分に memory_size<2> を追加します。つまり、switch_type<1> フィールドの上のニブルに追加し、増分に対応するアラインメントで整列します。
非カプセル化共用体は、共用体が 1 つの引数またはフィールドであり、スイッチがそれぞれ別の引数またはフィールドである一般的な状況です。
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> フィールドは、共用体のサイズとアームの説明にオフセットを与えます。これは、カプセル化された共用体の場合と同じであり、同じ型のすべての非カプセル化共用体によって共有されます。
memory_size<2>
union_arm_selector<>