ключевое слово union (RPC)
Некоторые функции языка C, такие как профсоюзы, требуют специальных ключевых слов MIDL для поддержки их использования в удаленных вызовах процедур. Объединение на языке C — это переменная, содержащая объекты разных типов и размеров. Разработчик обычно создает переменную для отслеживания типов, хранящихся в союзе. Чтобы правильно работать в распределенной среде, переменная, указывающая тип объединения, или дискриминантные, также должны быть доступны удаленному компьютеру. MIDL предоставляет ключевые слова [switch_type] и [switch_is] для идентификации типа и имени дискриминанта.
MIDL требует передачи дискриминанта с объединением одним из двух способов:
- Объединение и дискриминант должны быть предоставлены в качестве параметров.
- Объединение и дискриминант должны быть упакованны в структуру.
Два основных типа дискриминации профсоюзов предоставляются MIDL: nonencapsulated_union и encapsulated_union. Дискриминант некапсулированного объединения является другим параметром, если объединение является параметром. Это другое поле, если объединение является полем структуры. Определение инкапсулированного объединения превращается в определение структуры, первое поле которого является дискриминантным и чьим вторым и последним полями являются объединение. В следующем примере показано, как предоставить объединение и дискриминант в качестве параметров:
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);
Объединение в предыдущем примере может содержать одно значение: короткое, floatили char. Определение типа для объединения включает атрибут MIDL switch_type, указывающий тип дискриминанта. Здесь [switch_type(short)] указывает, что дискриминант имеет тип коротких. Параметр должен быть целым типом.
Если объединение является членом структуры, дискриминант должен быть членом той же структуры. Если объединение является параметром, дискриминант должен быть другим параметром. Прототип функции UnionParamProc в предыдущем примере показывает дискриминантный sUtype в качестве последнего параметра вызова. (Дискриминант может отображаться в любой позиции в вызове.) Тип параметра, указанного в атрибуте [switch_is], должен соответствовать типу, указанному в атрибуте [switch_type].
В следующем примере показано использование одной структуры, которая упаковает дискриминант с объединением:
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);
Компилятор MICROSOFT RPC MIDL разрешает объявления профсоюзов за пределами конструкторов typedef. Эта функция является расширением для IDL DCE. Дополнительные сведения см. в профсоюзных.