Udostępnij przez


słowo kluczowe union (RPC)

Niektóre funkcje języka C, takie jak związki, wymagają specjalnych słów kluczowych MIDL do obsługi ich użycia w zdalnych wywołaniach procedur. Związek w języku C to zmienna, która zawiera obiekty różnych typów i rozmiarów. Deweloper zwykle tworzy zmienną, aby śledzić typy przechowywane w unii. Aby poprawnie działać w środowisku rozproszonym, zmienna wskazująca typ unii lub dyskryminującymusi być również dostępna dla komputera zdalnego. MIDL udostępnia słowa kluczowe [switch_type] i [switch_is] w celu zidentyfikowania niezgodnego typu i nazwy.

MIDL wymaga, aby dyskryminator został przekazany unii na jeden z dwóch sposobów:

  • Związek i dyskryminator muszą być podane jako parametry.
  • Związek i dyskryminator muszą być pakowane w strukturze.

Dwa podstawowe typy związków dyskryminowanych są udostępniane przez MIDL: nonencapsulated_union i encapsulated_union. Dyskryminator nieuwzwolonej unii jest innym parametrem, jeśli związek jest parametrem. Jest to inne pole, jeśli unia jest polem struktury. Definicja hermetyzowanej unii jest zamieniana w definicję struktury, której pierwsze pole jest dyskryminujące i którego drugie i ostatnie pola są unią. W poniższym przykładzie pokazano, jak podać związek i dyskryminować jako parametry:

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);

Związek w poprzednim przykładzie może zawierać jedną wartość: krótkie, zmiennoprzecinkowelub char. Definicja typu dla unii zawiera atrybut switch_type MIDL, który określa typ dyskryminatora. W tym miejscu [switch_type(krótki)] określa, że dyskryminator jest typu krótkim. Przełącznik musi być typem całkowitym.

Jeśli związek jest członkiem struktury, dyskryminator musi być członkiem tej samej struktury. Jeśli związek jest parametrem, dyskryminator musi być innym parametrem. Prototyp funkcji UnionParamProc w poprzednim przykładzie pokazuje dyskryminujące sUtype jako ostatni parametr wywołania. (Dyskryminator może pojawić się w dowolnej pozycji w wywołaniu). Typ parametru określonego w [switch_is] atrybutu musi być zgodny z typem określonym w atrybucie [switch_type].

W poniższym przykładzie pokazano użycie pojedynczej struktury, która pakuje dyskryminujące z unią:

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);

Kompilator MICROSOFT RPC MIDL umożliwia deklaracje unii spoza konstrukcji typedef. Ta funkcja jest rozszerzeniem języka IDL DCE. Aby uzyskać więcej informacji, zobacz union.