union 关键字 (keyword) (RPC)

C 语言的某些功能(如联合)需要特殊的 MIDL 关键字来支持它们在远程过程调用中的使用。 C 语言中的联合是一个包含不同类型和大小的对象的变量。 开发人员通常创建一个变量来跟踪联合中存储的类型。 若要在分布式环境中正确运行,指示联合类型的变量(或 判别函数)还必须对远程计算机可用。 MIDL 提供 [switch_type] 和 [switch_is] 关键字来标识判别类型和名称。

MIDL 要求通过以下两种方式之一将判别者与联合一起传输:

  • 必须提供联合和判别器作为参数。
  • 联合和判别者必须打包在 结构中。

MIDL 提供了两种基本类型的可歧视联合: nonencapsulated_unionencapsulated_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);

上述示例中的联合可以包含单个值: shortfloatchar。 联合的类型定义包括 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