wire_marshal-Attribut

Das Attribut [wire_marshal] gibt einen Datentyp an, der für die Übertragung (den Drahttyp) anstelle eines anwendungsspezifischen Datentyps ( userm-type) verwendet wird.

typedef [wire_marshal(wire_type)] type-specifier userm-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

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.

Typbezeichner

Der Typ, für den der Benutzertyp zu einem Alias wird.

userm-type

Gibt den Bezeichner des Benutzerdatentyps an, der gemarschiert werden soll. Es kann ein beliebiger Typ sein, wie durch den Typbezeichner angegeben, solange er eine gut definierte Größe hat. Der Benutzertyp muss nicht übertragen werden, muss aber ein Typ sein, der dem MIDL-Compiler bekannt ist.

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 anwendungsspezifische Datentyp, userm-type, verfügt über eine 1:1-Korrespondenz mit einem Drahttyp , 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. Wenn eingebettete Typen in Ihren Daten vorhanden sind, die auch mit [wire_marshal] oder [user_marshal] definiert sind, müssen Sie auch die Wartung dieser eingebetteten Typen verwalten. Weitere Informationen zu diesen Routinen finden Sie im wire_marshal-Attribut.

Ihre Implementierung muss den Marshallregeln gemäß der OSF-DCE-Spezifikation entsprechen. Details zur Syntax der NDR-Übertragung finden Sie unter https://www.opengroup.org/onlinepubs/9629399/chap14.htm. Es wird nicht empfohlen , [wire_marshal] zu verwenden, wenn Sie nicht mit dem Drahtprotokoll vertraut sind.

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.

Sie können das Attribut [wire_marshal] nicht direkt oder indirekt verwenden, da das NDR-Modul die Speicherzuweisung für den übertragenen Typ nicht steuert.

Beispiele

typedef unsigned long _FOUR_BYTE_DATA;

typedef struct _TWO_X_TWO_BYTE_DATA 
{
        unsigned short low;
        unsigned short high;
} TWO_X_TWO_BYTE_DATA;

typedef [wire_marshal(TWO_X_TWO_BYTE_DATA)] 
    _FOUR_BYTE_DATA FOUR_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

Zuordnen

Datendarstellung

MIDL-Basistypen

Lange

NdrGetUserMarshalInfo

Das wire_marshal-Attribut

transmit_as

Unsigned

user_marshal