Leer en inglés

Compartir a través de


palabra clave union (RPC)

Algunas características del lenguaje C, como uniones, requieren palabras clave MIDL especiales para admitir su uso en llamadas a procedimientos remotos. Una unión en el lenguaje C es una variable que contiene objetos de diferentes tipos y tamaños. Normalmente, el desarrollador crea una variable para realizar un seguimiento de los tipos almacenados en la unión. Para funcionar correctamente en un entorno distribuido, la variable que indica el tipo de unión, o el discriminante, también debe estar disponible para el equipo remoto. MIDL proporciona las palabras clave [switch_type] y [switch_is] para identificar el tipo y el nombre discriminantes.

MIDL requiere que el discriminante se transmita con la unión de una de estas dos maneras:

  • La unión y el discriminante deben proporcionarse como parámetros.
  • La unión y el discriminante deben empaquetarse en una estructura.

MIDL proporciona dos tipos fundamentales de uniones discriminadas: nonencapsulated_union y encapsulated_union. El discriminante de una unión no encapsulada es otro parámetro si la unión es un parámetro. Es otro campo si la unión es un campo de una estructura. La definición de una unión encapsulada se convierte en una definición de estructura cuyo primer campo es el discriminante y cuyos campos segundo y último son la unión. En el ejemplo siguiente se muestra cómo proporcionar la unión y el discriminante como parámetros:

typedef [switch_type(short)] union 
{
    [case(0)]    short     sVal;
    [case(1)]    float     fVal;
    [case(2)]    char      chVal;
    [default]    ;
} DISCRIM_UNION_PARAM_TYPE;
 
short UnionParamProc(
    [in, switch_is(sUtype)] DISCRIM_UNION_PARAM_TYPE Union,
    [in] short sUtype);

La unión del ejemplo anterior puede contener un único valor: short, float o char. La definición de tipo para la unión incluye el atributo MIDL switch_type que especifica el tipo del discriminante. Aquí, [switch_type(short)] especifica que el discriminante es de tipo short. El modificador debe ser un tipo entero.

Si la unión es miembro de una estructura, el discriminante debe ser miembro de la misma estructura. Si la unión es un parámetro, el discriminante debe ser otro parámetro. El prototipo de la función UnionParamProc en el ejemplo anterior muestra el sUtype discriminante como el último parámetro de la llamada. (El discriminante puede aparecer en cualquier posición de la llamada). El tipo del parámetro especificado en el atributo [switch_is] debe coincidir con el tipo especificado en el atributo [switch_type].

En el ejemplo siguiente se muestra el uso de una única estructura que empaqueta el discriminante con la unión:

typedef struct 
{
    short utype;  /* discriminant can precede or follow union */
    [switch_is(utype)] union 
    {
       [case(0)]   short     sVal;
       [case(1)]   float     fVal;
       [case(2)]   char      chVal;
       [default]   ;
    } u;
} DISCRIM_UNION_STRUCT_TYPE;
 
short UnionStructProc(
    [in] DISCRIM_UNION_STRUCT_TYPE u1);

El compilador MIDL rpc de Microsoft permite declaraciones de unión fuera de construcciones typedef . Esta característica es una extensión de DCE IDL. Para más información, consulte unión.