user_marshal-Attribut
Das user_marshal ACF-Attribut ordnet einen benannten lokalen Typ in der Zielsprache (userm-type) einem Übertragungstyp (wire-type) zu, der zwischen Client und Server übertragen wird.
typedef [user_marshal(userm_type)] wire-type;
unsigned long __RPC_USER < userm_type >_UserSize(
unsigned long __RPC_FAR *pFlags,
unsigned long StartingSize,
< userm_type > __RPC_FAR * pUser_typeObject );
unsigned char __RPC_FAR * __RPC_USER < userm-type >_UserMarshal(
unsigned long __RPC_FAR *pFlags,
unsigned char __RPC_FAR * Buffer,
< userm_type > __RPC_FAR * pUser_typeObject);
unsigned char __RPC_FAR * __RPC_USER < userm_type >_UserUnmarshal(
unsigned long __RPC_FAR * pFlags,
unsigned char __RPC_FAR * Buffer,
< userm_type > __RPC_FAR * pUser_typeObject);
void __RPC_USER < userm_type >_UserFree(
unsigned long __RPC_FAR * pFlags,
< userm_type > __RPC_FAR * pUser_typeObject);
Parameter
-
userm-type
-
Gibt den Bezeichner des benutzerdatentyps an, der gemarshallt werden soll. Der userm-type muss nicht übertragbar sein und darf kein Typ sein, der dem MIDL-Compiler bekannt ist.
-
wire-type
-
Gibt den benannten Übertragungsdatentyp an, der tatsächlich zwischen Client und Server übertragen wird. Der Drahttyp muss ein MIDL-Basistyp, ein vordefinierter Typ oder ein Typbezeichner eines Typs sein, der über das Netzwerk übertragen werden kann.
-
pFlags
-
Gibt einen Zeiger auf ein Flagfeld ( unsignedlong) an. Das Wort mit hoher Ordnung gibt NDR-Datendarstellungsflags an, wie von DCE für Gleitkomma-, Big- oder Little-Endian-Darstellung und Zeichendarstellung definiert. Das Wort mit niedriger Ordnung gibt ein Marshallingkontextflag an. Das genaue Layout der Flags wird unter Die type_UserSize-Funktion beschrieben.
-
StartingSize
-
Gibt die aktuelle Puffergröße (Offset) vor der Größenanpassung des Objekts an.
-
pUser_typeObject
-
Gibt einen Zeiger auf ein Objekt der userm_type an.
-
Buffer
-
Gibt den aktuellen Pufferzeiger an.
Bemerkungen
Jeder benannte lokale Typ, userm-type, weist eine 1:1-Korrespondenz mit einem Drahttyp auf, der die Drahtdarstellung des Typs definiert. Sie müssen Routinen bereitstellen, um die Daten für das Marshalling zu vergrößern, die Daten zu marshallen und zu entmarsen und arbeitsspeicherfrei zu machen. Weitere Informationen zu diesen Routinen finden Sie unter The user_marshal Attribute. Wenn ihre Daten eingebettete Typen enthalten, die auch mit user_marshal oder [ [wire_marshal] definiert sind, müssen Sie auch die Wartung dieser eingebetteten Typen verwalten.
Der Drahttyp darf kein Schnittstellenzeiger oder ein vollständiger Zeiger sein. Der Drahttyp muss über eine klar definierte Arbeitsspeichergröße verfügen. Ausführliche Informationen zum Marshallen eines bestimmten Drahttyps finden Sie unter Marshallingregeln für user_marshal und wire_marshal.
Der userm-type sollte kein Schnittstellenzeiger sein, da diese direkt gemarshallt werden können. Wenn der Benutzertyp ein vollständiger Zeiger ist, müssen Sie den Alias selbst verwalten.
Beispiele
// Marshal a long as a structure containing two shorts.
typedef unsigned long FOUR_BYTE_DATA;
typedef struct _TWO_X_TWO_BYTE_DATA
{
unsigned short low;
unsigned short high;
} TWO_X_TWO_BYTE_DATA;
// ACFL file
typedef [user_marshal(FOUR_BYTE_DATA)] TWO_X_TWO_BYTE_DATA;
// Marshaling functions:
// Calculate size that converted data will require in the buffer
unsigned long __RPC_USER FOUR_BYTE_DATA_UserSize(
ULONG __RPC_FAR * pulFlags,
ULONG __RPC_FAR ulStartingSize,
FOUR_BYTE_DATA __RPC_FAR * pul);
// Copy FOUR_BYTE_DATA into buffer as TWO_X_TWO_BYTE_DATA
unsigned long __RPC_USER FOUR_BYTE_DATA_UserMarshal(
ULONG __RPC_FAR *pulFlags,
char __RPC_FAR * pBufferStart,
FOUR_BYTE_DATA __RPC_FAR * pul);
// Recreate FOUR_BYTE_DATA from TWO_X_TWO_BYTE_DATA in buffer
unsigned long __RPC_USER FOUR_BYTE_DATA_UserUnmarshal(
ULONG __RPC_FAR * pulFlags,
char __RPC_FAR * pBufferStart,
FOUR_BYTE_DATA __RPC_FAR * pul);
// Nothing to do here as the engine frees the top node and FOUR_BYTE_DATA is a flat data type.
void __RPC_USER FOUR_BYTE_DATA_UserFree(
ULONG __RPC_FAR * pulFlags,
FOUR_BYTE_DATA __RPC_FAR * pul);
Weitere Informationen