union キーワード (keyword) (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);
前の例の共用体には、 short、 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 の拡張機能です。 詳細については、「 共用体」を参照してください。