union keyword (RPC)
Vissa funktioner i C-språket, till exempel fackföreningar, kräver särskilda MIDL-nyckelord för att stödja deras användning i fjärrproceduranrop. En union i C-språket är en variabel som innehåller objekt av olika typer och storlekar. Utvecklaren skapar vanligtvis en variabel för att hålla reda på de typer som lagras i unionen. För att fungera korrekt i en distribuerad miljö måste variabeln som anger typen av union, eller diskriminerande, också vara tillgänglig för fjärrdatorn. MIDL innehåller nyckelorden [switch_type] och [switch_is] för att identifiera den diskriminerande typen och namnet.
MIDL kräver att diskriminanten överförs med facket på ett av två sätt:
- Facket och den diskriminerande måste anges som parametrar.
- Facket och den diskriminerande måste paketeras i en struktur.
Två grundläggande typer av diskriminerade fackföreningar tillhandahålls av MIDL: nonencapsulated_union och encapsulated_union. Discriminant för en icke-kapslad union är en annan parameter om unionen är en parameter. Det är ett annat fält om unionen är ett fält i en struktur. Definitionen av en inkapslad union omvandlas till en strukturdefinition vars första fält är discriminant och vars andra och sista fält är unionen. I följande exempel visas hur du tillhandahåller unionen och discriminant som parametrar:
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);
Unionen i föregående exempel kan innehålla ett enda värde: antingen kort, flyttaleller tecken. Typdefinitionen för unionen innehåller attributet MIDL switch_type som anger typen av discriminant. Här anger [switch_type(short)] att den diskriminerande typen är av typen kort. Växeln måste vara en heltalstyp.
Om facket är medlem i en struktur måste den diskriminerande vara medlem i samma struktur. Om unionen är en parameter måste diskriminanten vara en annan parameter. Prototypen för funktionen UnionParamProc i föregående exempel visar den discriminanta sUtype som den sista parametern för anropet. (Den diskriminerande kan visas i vilken position som helst i samtalet.) Typen av parameter som anges i attributet [switch_is] måste matcha den typ som anges i attributet [switch_type].
I följande exempel visas användningen av en enda struktur som paketar den diskriminerande med unionen:
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);
Microsoft RPC MIDL-kompilatorn tillåter unionsdeklarationer utanför typedef- konstruktioner. Den här funktionen är ett tillägg till DCE IDL. Mer information finns i union.