Union Schlüsselwort (keyword) (RPC)
Einige Features der C-Sprache, z. B. unions, erfordern spezielle MIDL-Schlüsselwörter, um ihre Verwendung in Remoteprozeduraufrufen zu unterstützen. Eine Union in der Sprache C ist eine Variable, die Objekte unterschiedlicher Typen und Größen enthält. Der Entwickler erstellt normalerweise eine Variable, um die in der Union gespeicherten Typen nachzuverfolgen. Um in einer verteilten Umgebung ordnungsgemäß zu arbeiten, muss die Variable, die den Typ der Union oder den Diskriminanten angibt, auch für den Remotecomputer verfügbar sein. MIDL stellt die Schlüsselwörter [switch_type] und [switch_is] bereit, um den diskriminanten Typ und Namen zu identifizieren.
MIDL erfordert, dass das Diskriminant mit der Union auf eine von zwei Arten übertragen wird:
- Die Union und das Diskriminant müssen als Parameter angegeben werden.
- Die Union und das Diskriminant müssen in einer Struktur verpackt werden.
MIDL bietet zwei grundlegende Arten diskriminierter Gewerkschaften: nonencapsulated_union und encapsulated_union. Das Diskriminant einer nicht gekapselten Union ist ein weiterer Parameter, wenn die Union ein Parameter ist. Dies ist ein anderes Feld, wenn die Union ein Feld einer Struktur ist. Die Definition einer gekapselten Union wird in eine Strukturdefinition umgewandelt, deren erstes Feld das diskriminante ist und dessen zweite und letzte Felder die Union sind. Im folgenden Beispiel wird veranschaulicht, wie Die Union und diskriminant als Parameter bereitgestellt werden:
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);
Die Union im vorherigen Beispiel kann einen einzelnen Wert enthalten: entweder short, float oder char. Die Typdefinition für die Union enthält das MIDL-switch_type-Attribut , das den Typ des Diskriminanten angibt. Hier gibt [switch_type(short)] an, dass das Diskriminant vom Typ short ist. Der Switch muss ein ganzzahliger Typ sein.
Wenn die Union Mitglied einer Struktur ist, muss das diskriminante Mitglied derselben Struktur sein. Wenn die Union ein Parameter ist, muss der Diskriminant ein anderer Parameter sein. Der Prototyp für die Funktion UnionParamProc im vorherigen Beispiel zeigt den diskriminanten sUtype als letzten Parameter des Aufrufs. (Der Diskriminant kann an jeder Position im Aufruf angezeigt werden.) Der Im [switch_is] -Attribut angegebene Parametertyp muss mit dem im [switch_type] -Attribut angegebenen Typ übereinstimmen.
Im folgenden Beispiel wird die Verwendung einer einzelnen Struktur veranschaulicht, die das Diskriminant mit der Union verpackt:
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);
Der Microsoft RPC MIDL-Compiler lässt Union-Deklarationen außerhalb von Typedef-Konstrukten zu. Dieses Feature ist eine Erweiterung der DCE IDL. Weitere Informationen finden Sie unter union.