union 关键字 (RPC)
C 语言的某些功能(如联合)需要特殊的 MIDL 关键字来支持它们在远程过程调用中的使用。 C 语言中的联合是包含不同类型和大小的对象的变量。 开发人员通常会创建一个变量来跟踪联合中存储的类型。 若要在分布式环境中正常运行,指示联合类型或 区分的变量也必须可供远程计算机使用。 MIDL 提供 [switch_type] 和 [switch_is] 关键字来标识歧视类型和名称。
MIDL 要求以以下两种方式之一与联盟一起传输歧视:
- 必须以参数的形式提供联合和歧视。
- 联合和歧视必须打包在结构中。
MIDL 提供了两种基本类型的歧视联盟:nonencapsulated_union 和 encapsulated_union。 如果联合是参数,则非capsulated 联合的歧视是另一个参数。 如果联合是结构的字段,则为另一个字段。 封装联合的定义将转换为结构定义,其第一个字段是区分字段,其第二个字段和最后一个字段是联合。 以下示例演示如何提供联合和区分作为参数:
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);
前面的示例中的联合可以包含单个值:短、浮点或 字符。 联合的类型定义包括指定区分项类型的 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 构造之外的联合声明。 此功能是 DCE IDL 的扩展。 有关详细信息,请参阅 联合。