union キーワード (RPC)
共用体などの C 言語の一部の機能では、リモートプロシージャコールでの使用をサポートするために特別な MIDL キーワードが必要です。 C 言語の共用体は、さまざまな型とサイズのオブジェクトを保持する変数です。 開発者は通常、共用体に格納されている型を追跡する変数を作成します。 分散環境で正しく動作するには、共用体の種類を示す変数、または 判別もリモート コンピューターで使用できる必要があります。 MIDL には、[switch_type] キーワードと [switch_is] キーワードが用意されており、判別型と名前が識別されます。
MIDL では、次の 2 つの方法のいずれかで判別を共用体と共に送信する必要があります。
- 共用体と判別式は、パラメーターとして指定する必要があります。
- 共用体と判別子は、構造体にパッケージ化する必要があります。
MIDL では、nonencapsulated_union と encapsulated_unionの 2 つの基本的な種類の判別共用体が提供されます。 共用体がパラメーターの場合、非カプセル化共用体の判別は別のパラメーターです。 共用体が構造体のフィールドである場合は、別のフィールドです。 カプセル化された共用体の定義は、最初のフィールドが判別式であり、2 番目と最後のフィールドが共用体である構造体定義に変換されます。 次の例では、和集合と判別をパラメーターとして指定する方法を示します。
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 の 1 つの値含めることができます。 共用体の型定義には、判別式の型を指定する MIDL switch_type 属性が含まれます。 ここでは、[switch_type(short)] は、判別が short 型指定します。 スイッチは整数型である必要があります。
共用体が構造体のメンバーである場合、判別は同じ構造体のメンバーである必要があります。 共用体がパラメーターの場合、判別は別のパラメーターである必要があります。 前の例の UnionParamProc 関数のプロトタイプは、呼び出しの最後のパラメーターとして sUtype 判別を示しています。 (判別は呼び出しの任意の位置に現れることがあります。[switch_is] 属性で指定されたパラメーターの型は、[switch_type] 属性で指定された型と一致する必要があります。
次の例では、判別を共用体と共にパッケージ化する 1 つの構造体の使用を示します。
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 の拡張機能です。 詳細については、共用体参照してください。