_attribut de Marshal utilisateur

L’attribut ACF de _ Marshal d’utilisateur associe un type local nommé dans le langage cible (type utilisateur) à un type de transfert (type filaire) qui est 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

type d’utilisateur

Spécifie l’identificateur du type de données utilisateur à marshaler. Le type utilisateur n’a pas besoin d’être transmissible et n’a pas besoin d’être un type connu du compilateur MIDL.

type de câble

Spécifie le type de données de transfert nommé qui est réellement 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 ( unsigned long). Le mot de poids fort spécifie les indicateurs de représentation des données de rapport de non-remise tels qu’ils sont définis par DCE pour la représentation à virgule flottante, Big-endian et caractère. Le mot de poids faible spécifie un indicateur de contexte de marshaling. La disposition exacte des indicateurs est décrite dans la fonction type d' _ utilisateur.

StartingSize

Spécifie la taille de la mémoire tampon actuelle (décalage) avant le dimensionnement de l’objet.

pUser _ typeObject

Spécifie un pointeur vers un objet de _ type utilisateur.

Buffer

Spécifie le pointeur de la mémoire tampon actuelle.

Notes

Chaque type local nommé, utilisateur-type, a une correspondance un-à-un avec un type de câble qui définit la représentation filaire du type. Vous devez fournir des routines pour dimensionner les données pour le marshaling, pour marshaler et démarshaler les données, ainsi que pour libérer de la mémoire. Pour plus d’informations sur ces routines, consultez l' _ attribut User Marshal. Notez que s’il existe des types incorporés dans vos données qui sont également définis avec le _ Marshal utilisateur ou [ le [ _ Marshal ] de câble, 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 la façon de marshaler un type de câble donné, consultez la page règles de marshaling pour le marshaleur d’utilisateur _ et le _ marshaling de réseau .

Le type utilisateur ne doit pas être un pointeur d’interface, car ceux-ci peuvent être marshalés directement. Si le type d’utilisateur est un pointeur complet, vous devez gérer vous-même les alias.

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

Fichier de configuration de l’application (ACF)

Types de base MIDL

long

représenter _ comme

non signé

Attribut de _ Marshal d’utilisateur

Marshal de câble _

NdrGetUserMarshalInfo