Leer en inglés

Compartir a través de


Uniones RPC

Tanto las uniones encapsuladas como las no encapsuladas comparten un formato de union_arm_selector<> común:

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>

El campo union_arms<2> consta de dos partes. Si la unión es una unión de estilo MIDL 1.0, los 4 bits superiores contienen la alineación del brazo de unión (alineación del brazo más alineado). De lo contrario, los 4 bits superiores son cero. Los 12 bits inferiores contienen el número de brazos de la unión. En otras palabras:

alignment<highest nibble> arm_counter<three lower nibbles>

Los campos offset_to_arm_description<2> contienen un desplazamiento con signo relativo a la descripción del tipo del brazo. Sin embargo, el campo se sobrecarga con optimización para tipos simples. Para ellos, el byte superior de este campo de desplazamiento es FC_MAGIC_UNION_BYTE (0x80) y el byte inferior del corto es el tipo de carácter de formato real del brazo. Por lo tanto, hay dos intervalos para los valores de desplazamiento: "80 xx" significa que xx es una cadena de formato de tipo; y todo lo demás dentro del intervalo (80 FF .. 7f FF) significa un desplazamiento real. Esto hace desplazamientos del intervalo <80 00 .. 80 FF > no disponible como desplazamientos. El compilador comprueba que a partir de MIDL versión 5.1.164.

El campo default_arm_description<2> indica el tipo de brazo de unión del brazo predeterminado, si existe. Si no hay ningún brazo predeterminado especificado para la unión, el campo default_arm_description 2> se 0xFFFF<y se produce una excepción si el valor de switch_is no coincide con ninguno de los valores de mayúsculas y minúsculas del brazo. Si se especifica el brazo predeterminado pero está vacío, el campo default_arm_description<2> es cero. De lo contrario, el campo default_arm_description<2> tiene la misma semántica que los campos offset_to_arm_description<2> .

A continuación se muestra un resumen:

  • 0: valor predeterminado vacío
  • FFFF: sin valor predeterminado
  • 80xx: tipo simple
  • otro : desplazamiento relativo

Uniones encapsuladas

Una unión encapsulada procede de una sintaxis de unión especial en IDL. De hecho, una unión encapsulada es una estructura de agrupación con un campo discriminante al principio de la estructura y la unión como el único miembro.

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

El campo switch_type<1> de una unión encapsulada tiene dos partes. La nibble inferior proporciona el tipo de modificador real y la nibble superior proporciona el incremento de memoria para recorrer paso a paso por paso una cantidad que el puntero de memoria debe incrementarse para omitir más allá del campo de switch_is, que incluye cualquier relleno entre el campo switch_is() de la estructura construida por código auxiliar y el campo de unión real.

El campo memory_size<2> es el tamaño de la unión únicamente y es idéntico a las uniones no encapsuladas. Para obtener el tamaño total de la estructura que contiene la unión, agregue memory_size<2> al incremento de memoria para recorrer paso a paso por instrucciones, es decir, al borde superior del switch_type<1> campo y, a continuación, alinee por la alineación correspondiente al incremento.

Uniones no encapsuladas

Una unión no encapsulada es una situación típica en la que una unión es un argumento o campo y el modificador es otro argumento o campo, respectivamente.

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

Donde:

El campo switch_type<1> es un carácter de formato para el discriminante.

El campo switch_is_descriptor<> es un descriptor de correlación y tiene 4 o 6 bytes en función de si se usa /robust . Sin embargo, para el switch_is_description<>, si la unión está incrustada en una estructura, el campo de desplazamiento del switch_is_description<> es el desplazamiento al campo switch_is desde la posición de la unión en la estructura (no desde el principio de la estructura).

El campo offset_to_size_and_arm_description<2> proporciona el desplazamiento a la descripción de tamaño y brazo de la unión, que es idéntica a la de las uniones encapsuladas y que comparten todas las uniones no encapsuladas del mismo tipo:

memory_size<2> 
union_arm_selector<>