Fonction type_UserMarshal
La fonction <type>_UserMarshal est une fonction d’assistance pour les attributs [ wire_marshal] et [ user_marshal]. Les stubs appellent cette fonction pour marshaler les données côté client ou serveur. La fonction est définie comme suit :
unsigned char __RPC_FAR * __RPC_USER <type>_UserMarshal(
unsigned long __RPC_FAR * pFlags,
unsigned char __RPC_FAR * pBuffer,
<type> __RPC_FAR * pMyObj);
Le type <> dans le nom de la fonction signifie que le type d’utilisateur spécifié dans le [wire_marshal] ou [user_marshal] définition de type. Ce type peut être non modifiable ou même, lorsqu’il est utilisé avec l’attribut [user_marshal], un type inconnu du compilateur MIDL. Le nom du type de câble (le nom du type transmissible) n’est pas utilisé dans le prototype de fonction. Notez toutefois que le type de câble définit la disposition des câbles pour les données comme spécifié par OSF DCE.
Le paramètre pFlags est un pointeur vers un champ d’indicateur long non signé. Le mot supérieur de l’indicateur contient des indicateurs de représentation de données de remise tels que définis par OSF DCE pour les représentations à virgule flottante, l’ordre d’octet et les représentations de caractères. Le mot inférieur contient un indicateur de contexte de marshaling tel que défini par le canal COM. La disposition exacte des indicateurs dans le champ est décrite dans La fonction type_UserSize.
Le paramètre pBuffer est le pointeur de mémoire tampon actuel. Ce pointeur peut ou non être aligné sur l’entrée. Votre <type>_UserMarshal fonction doit aligner correctement le pointeur de mémoire tampon, marshaler les données et retourner la nouvelle position de mémoire tampon, qui est l’adresse du premier octet après l’objet marshalé. N’oubliez pas que la spécification de type de câble détermine la disposition réelle des données dans la mémoire tampon.
Le paramètre pMyObj est un pointeur vers un objet de type utilisateur.
La valeur de retour est la nouvelle position de mémoire tampon, qui est l’adresse du premier octet après l’objet non délimité.
Le dépassement de mémoire tampon peut se produire lorsque vous calculez incorrectement la taille des données et tentez de marshaler plus de données que prévu. Vous devez être prudent pour éviter cette situation. Vous pouvez les vérifier à l’aide du pointeur qui <type>_UserMarshal retourne. Sinon, vous risquez que le moteur de remise d’échec déclenche une exception de dépassement de mémoire tampon ultérieurement.
Les exceptions doivent être interceptées et gérées localement, les exceptions ne doivent pas être autorisées à propigation de la pile des appels.
Rubriques connexes
-
règles de marshaling pour user_marshal et wire_marshal