Freigeben über


Das attribut user_marshal

Das Attribut [ user_marshal] ist ein ACF-Typ-Attribut ähnlich in der Syntax wie [ represent_as]. Wie beim IDL-Attribut bietet [ wire_marshal], es bietet eine effizientere Möglichkeit, Daten über ein Netzwerk hinweg zu marshallen. Als ACF-Attribut können Sie mit [user_marshal] benutzerdefinierte Datentypen marshallen, die für MIDL unbekannt sind. Jeder anwendungsspezifische Typ verfügt über einen entsprechenden übertragungsfähigen Typ, der die Drahtdarstellung definiert.

Ihr anwendungsspezifischer Typ kann ein einfacher, zusammengesetzter oder Zeigertyp sein. Die Haupteinschränkung besteht darin, dass die Typinstanz über eine feste, klar definierte Speichergröße verfügen muss. Wenn sich die Größe der Typinstanz ändern muss, verwenden Sie ein Zeigerfeld anstelle eines konformen Arrays. Alternativ können Sie einen Zeiger auf den veränderbaren Typ definieren.

Wie bei der [wire_marshal] Attribut geben Sie Routinen für die Größenanpassung, das Marshalling, das Entmarshaling und die Freihanddurchläufe an. In der folgenden Tabelle werden die vier vom Benutzer bereitgestellten Routinenamen beschrieben. Der <Typ> ist der in der [user_marshal] Typdefinition angegebeneTyp typ.

Routine Beschreibung
<Typ>_UserSize Passt die Größe des RPC-Datenpuffers vor dem Marshalling auf client- oder serverseitiger Seite an.
<Typ>_UserMarshal Marshallt die Daten auf client- oder serverseitiger Seite.
<Typ>_UserUnmarshal Entmarsen Sie die Daten auf client- oder serverseitiger Seite.
<Typ>_UserFree Gibt die Daten auf serverseitiger Seite frei.

 

Diese vom Benutzer bereitgestellten Routinen werden entweder vom Client oder der Serveranwendung basierend auf den direktionalen Attributen bereitgestellt.

Wenn der Parameter in ] nur [] ist, wird der Client an den Server übertragen. Der Client benötigt den <Typ>_UserSize und <Typ>_UserMarshal Funktionen. Der Server benötigt den <Typ>_UserUnmarshal und <Typ>_UserFree Funktionen.

Bei einem [ ]-only-Parameter überträgt der Server an den Client. Der Server benötigt den <Typ>_UserSize und <Typ>_UserMarshal Funktionen, während der Client den <Typ>_UserMarshal Funktion benötigt.

Das wire_marshal-Attribut

Marshaling-Regeln für Benutzermarsing und wire_marshal

user_marshal

wire_marshal

NdrGetUserMarshalInfo