palavra-chave união (RPC)

Alguns recursos da linguagem C, como uniões, exigem palavras-chave MIDL especiais para dar suporte ao 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 da união ou o discriminante também deve estar disponível para o computador remoto. MIDL fornece as palavras-chave [switch_type] e [switch_is] para identificar o tipo e o nome discriminantes.

MIDL exige que o discriminante seja transmitido com a união de uma das duas maneiras:

  • A união e o discriminante devem ser fornecidos como parâmetros.
  • A união e o discriminante devem ser empacotados em uma estrutura.

Dois tipos fundamentais de uniões discriminadas são fornecidos pela MIDL: nonencapsulated_union e encapsulated_union. O discriminante de uma união nonencapsulada será outro parâmetro se a união for um parâmetro. Será outro campo se a união for 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 últimos 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, float ou char. A definição de tipo para a união inclui o atributo MIDL switch_type que especifica o tipo do discriminante. Aqui, [switch_type(short)] especifica que o discriminante é do tipo curto. A opção deve ser um tipo inteiro.

Se a união for membro de uma estrutura, o discriminador deverá ser membro da mesma estrutura. Se a união for um parâmetro, o discriminante deverá ser outro parâmetro. O protótipo da função UnionParamProc no exemplo anterior mostra o sUtype discriminante como o último parâmetro da chamada. (O discriminador 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 dos constructos typedef . Esse recurso é uma extensão para O IDL do DCE. Para obter mais informações, confira união.