attribut user_marshal
L’attribut ACF user_marshal associe un type local nommé dans la langue cible (userm-type) à un type de transfert (type filaire) transféré entre le client et le serveur.
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);
Paramètres
-
userm-type
-
Spécifie l’identificateur du type de données utilisateur à marshaler. Le type userm n’a pas besoin d’être transmettable et n’a pas besoin d’être un type connu du compilateur MIDL.
-
wire-type
-
Spécifie le type de données de transfert nommé qui est effectivement transféré entre le client et le serveur. Le type de câble doit être un type de base MIDL, un type prédéfini ou un identificateur de type d’un type qui peut être transmis sur le réseau.
-
pFlags
-
Spécifie un pointeur vers un champ d’indicateur ( long non signé). Le mot d’ordre supérieur spécifie les indicateurs de représentation des données de remise de remise tels que définis par DCE pour la représentation à virgule flottante, big-endian ou little-endian et la représentation de caractères. Le mot d’ordre inférieur spécifie un indicateur de contexte de marshaling. La disposition exacte des indicateurs est décrite dans La fonction type_UserSize.
-
StartingSize
-
Spécifie la taille actuelle de la mémoire tampon (décalage) avant le dimensionnement de l’objet.
-
pUser_typeObject
-
Spécifie un pointeur vers un objet de userm_type.
-
Buffer
-
Spécifie le pointeur de mémoire tampon actuel.
Notes
Chaque type local nommé, userm-type, a une correspondance un-à-un avec un type de fil qui définit la représentation filaire du type. Vous devez fournir des routines pour dimensionner les données à des fins de marshaling, de marshaler et de démarshaler les données et de libérer de la mémoire. Pour plus d’informations sur ces routines, consultez Attribut user_marshal. Notez que s’il existe des types incorporés dans vos données qui sont également définis avec user_marshal ou [ [wire_marshal], vous devez également gérer la maintenance de ces types incorporés.
Le type de câble ne peut pas être un pointeur d’interface ou un pointeur complet. Le type de câble doit avoir une taille de mémoire bien définie. Pour plus d’informations sur le marshaling d’un type de câble donné, consultez Marshaling Rules for user_marshal and wire_marshal.
Le type userm ne doit pas être un pointeur d’interface, car il peut être marshalé directement. Si le type d’utilisateur est un pointeur complet, vous devez gérer l’alias vous-même.
Exemples
// 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);
Voir aussi