Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 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 requer que o discriminante seja transmitido com a união de duas maneiras:
- A união e o discriminante devem ser fornecidos como parâmetros.
- A união e o discriminador 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 nãocapsulada 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 ú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, 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 o sindicato for membro de uma estrutura, o discriminante 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 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 MIDL do Microsoft RPC permite declarações de união fora de construções de typedef. Esse recurso é uma extensão da IDL do DCE. Para obter mais informações, consulte union.