Partilhar via


palavra-chave união (RPC)

Alguns recursos da linguagem C, como uniões, exigem palavras-chave MIDL especiais para suportar seu uso em chamadas de procedimento remoto. Uma união na linguagem C é uma variável que contém objetos de diferentes tipos e tamanhos. O desenvolvedor geralmente cria uma variável para acompanhar os tipos armazenados na união. Para operar corretamente em um ambiente distribuído, a variável que indica o tipo de união, ou o discriminante, também deve estar disponível para o computador remoto. O MIDL fornece as palavras-chave [switch_type] e [switch_is] para identificar o tipo e o nome discriminante.

O MIDL exige que o discriminante seja transmitido com o sindicato de uma de duas formas:

  • O sindicato e o discriminante devem ser fornecidos como parâmetros.
  • O sindicato e o discriminante devem ser embalados numa estrutura.

Dois tipos fundamentais de sindicatos discriminados são fornecidos pelo MIDL: nonencapsulated_union e encapsulated_union. O discriminante de uma união não encapsulada é outro parâmetro se a união for um parâmetro. É outro campo se o sindicato é um campo de uma estrutura. A definição de uma união encapsulada é transformada em uma definição de estrutura cujo primeiro campo é o discriminante e cujo segundo e último campos são a união. O exemplo a seguir demonstra como fornecer a união e o 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);

A união no exemplo anterior pode conter um único valor: curto, flutuarou char. A definição de tipo para a união inclui o atributo MIDL switch_type que especifica o tipo do discriminante. Neste caso, [switch_type(breve)] especifica que o discriminante é do tipo curto. O comutador deve ser um tipo inteiro.

Se o sindicato é membro de uma estrutura, então o discriminante deve ser um membro da mesma estrutura. Se a união é um parâmetro, então o discriminante deve ser outro parâmetro. O protótipo para a função UnionParamProc no exemplo anterior mostra o discriminante sUtype como o último parâmetro da chamada. (O discriminante pode aparecer em qualquer posição na chamada.) O tipo do parâmetro especificado no atributo [switch_is] deve corresponder ao tipo especificado no atributo [switch_type].

O exemplo a seguir demonstra o uso de uma única estrutura que empacota o discriminante com a união:

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

O compilador Microsoft RPC MIDL permite declarações de união fora de construções de typedef. Este recurso é uma extensão do DCE IDL. Para obter mais informações, consulte união.