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 solo valor: corto , floato char. La definición de tipo de 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 discrimina nte como ú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 de MICROSOFT RPC permite declaraciones de unión fuera de definición de tipos construcciones. Esta característica es una extensión de DCE IDL. Para obtener más información, consulte union.