培训
union 关键字 (keyword) (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);
上述示例中的联合可以包含单个值: short、 float 或 char。 联合的类型定义包括 MIDL switch_type 属性,该属性指定判别对象的类型。 此处,[switch_type (short) ] 指定判别符的类型为 short。 开关必须是整数类型。
如果联合是结构的成员,则判别者必须是同一结构的成员。 如果联合是一个参数,则判别者必须是另一个参数。 上例中函数 UnionParamProc 的原型将区分性 sUtype 显示为调用的最后一个参数。 (判别符可以出现在 call.) [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 的扩展。 有关详细信息,请参阅 union。