Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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.