user_marshal Attribut

Das user_marshalACF-Attribut verknüpft einen benannten lokalen Typ in der Zielsprache (userm-type) mit einem Übertragungstyp (Drahttyp), 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 gemarschiert werden soll. Der Benutzertyp muss nicht übertragen werden und muss kein Typ sein, der dem MIDL-Compiler bekannt ist.

Drahttyp

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 Flag-Feld (unsignedlong) an. Das Wort mit hoher Reihenfolge gibt NDR-Datendarstellungskennzeichnungen an, die von DCE für Gleitkomma-, Big- oder Little-Endianer- und Zeichendarstellung definiert sind. Das Wort mit niedriger Reihenfolge gibt ein Marshaling-Kontextflagge an. Das genaue Layout der Flags wird in "The type_UserSize Function" beschrieben.

StartSize

Gibt die aktuelle Puffergröße (Offset) an, bevor das Objekt vergrößert wird.

pUser_typeObject

Gibt einen Zeiger auf ein Objekt von 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 Marshaling, zum Marshal und zum Entmarsen der Daten und zum Freihanden des Arbeitsspeichers bereitzustellen. Weitere Informationen zu diesen Routinen finden Sie im user_marshal-Attribut. Wenn eingebettete Typen in Ihren Daten vorhanden sind, die auch mit user_marshal oder [ [wire_marshal] definiert sind, müssen Sie auch die Wartung dieser eingebetteten Typen verwalten.

Der Drahttyp kann kein Schnittstellenzeiger oder ein vollständiger Zeiger sein. Der Drahttyp muss über eine gut definierte Speichergröße verfügen. Weitere Informationen zum Marshalling eines bestimmten Drahttyps finden Sie unter "Marshaling Rules" für user_marshal und wire_marshal.

Der Benutzertyp sollte kein Schnittstellenzeiger sein, da diese direkt gemarstet 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

Anwendungskonfigurationsdatei (ACF)

MIDL-Basistypen

Lange

represent_as

Unsigned

Das user_marshal-Attribut

wire_marshal

NdrGetUserMarshalInfo