Union-Schlüsselwort (RPC)
Einige Features der Sprache C, z. B. Gewerkschaften, erfordern spezielle MIDL-Schlüsselwörter, um ihre Verwendung in Remoteprozeduraufrufen zu unterstützen. Eine Vereinigung in der Sprache C ist eine Variable, die Objekte unterschiedlicher Typen und Größen enthält. Der Entwickler erstellt in der Regel eine Variable, um die in der Union gespeicherten Typen nachzuverfolgen. Um ordnungsgemäß in einer verteilten Umgebung zu arbeiten, muss die Variable, die den Typ der Vereinigung angibt, oder die diskriminantenauch 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 setzt voraus, dass der Diskriminant auf eine von zwei Arten mit der Gewerkschaft übertragen wird:
- Die Vereinigung und der Diskriminant müssen als Parameter angegeben werden.
- Die Vereinigung und der Diskriminant müssen in einer Struktur gepackt werden.
Zwei grundlegende Arten diskriminierter Gewerkschaften werden von MIDL bereitgestellt: nonencapsulated_union und encapsulated_union. Der Diskriminant einer nicht gekapselten Union ist ein weiterer Parameter, wenn die Union ein Parameter ist. Es handelt sich um ein weiteres Feld, wenn die Vereinigung ein Feld einer Struktur ist. Die Definition einer gekapselten Vereinigung wird in eine Strukturdefinition umgewandelt, deren erstes Feld diskriminierend ist und deren zweite und letzte Felder die Vereinigung 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 kurze, float-oder zeichen. Die Typdefinition für die Union enthält das MIDL-attribut switch_type, das den Typ des Diskriminanten angibt. Hier gibt [switch_type(short)] an, dass der Diskriminant vom Typ kurzenist. Der Schalter muss ein ganzzahliger Typ sein.
Wenn die Vereinigung Mitglied einer Struktur ist, muss der Diskriminant mitglied der gleichen Struktur sein. Wenn die Union ein Parameter ist, muss der Diskriminant ein weiterer 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 einer beliebigen Position im Anruf angezeigt werden.) Der Typ des parameters, der im [switch_is] Attribut angegeben ist, muss mit dem typ übereinstimmen, der im [switch_type] Attribut angegeben ist.
Im folgenden Beispiel wird die Verwendung einer einzelnen Struktur veranschaulicht, die den Diskriminanten mit der Vereinigung 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 ermöglicht Union-Deklarationen außerhalb von typedef--Konstrukten. Dieses Feature ist eine Erweiterung für DCE IDL. Weitere Informationen finden Sie unter Union.