union 关键字 (RPC)

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

MIDL 要求以以下两种方式之一与联盟一起传输歧视:

  • 必须以参数的形式提供联合和歧视。
  • 联合和歧视必须打包在结构中。

MIDL 提供了两种基本类型的歧视联盟:nonencapsulated_unionencapsulated_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 的扩展。 有关详细信息,请参阅 联合