wire_marshal-Attribut
Das Attribut [wire_marshal] gibt einen Datentyp an, der für die Übertragung (der Wire-Type) 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
-
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.
-
Typspezifizierer
-
Der Typ, für den userm-type zu einem Alias wird.
-
userm-type
-
Gibt den Bezeichner des Benutzerdatentyps an, der gemarst werden soll. Es kann sich um einen beliebigen Typ handeln, der vom Typbezeichner angegeben wird, sofern er eine klar definierte Größe aufweist. Der userm-type muss nicht übertragbar sein, sondern muss ein Typ sein, der dem MIDL-Compiler bekannt ist.
-
pFlags
-
Gibt einen Zeiger auf ein Flagfeld an ( ohne Vorzeichenlang). Das Wort mit hoher Ordnung gibt NDR-Datendarstellungsflags an, die von DCE für Gleitkomma-, Big- oder Little-Endian- und Zeichendarstellung definiert sind. Das Wort mit niedriger Reihenfolge gibt ein Marshallkontextflag an. Das genaue Layout der Flags wird in The type_UserSize Function beschrieben.
-
StartingSize
-
Gibt die aktuelle Puffergröße (Offset) vor der Größenanpassung des Objekts an.
-
pUser_typeObject
-
Gibt einen Zeiger auf ein Objekt mit userm_type an.
-
Buffer
-
Gibt den aktuellen Pufferzeiger an.
Bemerkungen
Jeder anwendungsspezifische Datentyp 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 Marshallen zu vergrößern, die Daten zu marshallen und aufzuheben und Arbeitsspeicher freizugeben. Beachten Sie, dass Sie auch die Wartung dieser eingebetteten Typen verwalten müssen, wenn in Ihren Daten eingebettete Typen vorhanden sind, die auch mit [wire_marshal] oder [user_marshal] definiert sind. Weitere Informationen zu diesen Routinen finden Sie unter Das wire_marshal-Attribut.
Ihre Implementierung muss den Marshallregeln gemäß der OSF-DCE-Spezifikation entsprechen. Details zur NDR-Übertragungssyntax finden Sie unter https://www.opengroup.org/onlinepubs/9629399/chap14.htm. Es wird nicht empfohlen , [wire_marshal] zu verwenden, wenn Sie mit dem Drahtprotokoll nicht vertraut sind.
Der Drahttyp darf kein Schnittstellenzeiger oder ein vollständiger Zeiger sein. Der Drahttyp muss über eine klar definierte Arbeitsspeichergröße verfügen. Weitere Informationen zum Marshallen eines bestimmten Drahttyps finden Sie unter Marshallregeln für user_marshal und wire_marshal.
Der userm-type sollte kein Schnittstellenzeiger sein, da diese direkt gemarst 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 mit dem Attribut [allocation] verwenden, da die NDR-Engine die Speicherzuordnung 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