Fonction type_UserSize

La <fonction type>_UserSize est une fonction d’assistance pour les attributs [ wire_marshal] et [ user_marshal]. Les stubs appellent cette fonction pour dimensionner la mémoire tampon de données RPC pour l’objet de données utilisateur avant que les données ne sont marshalées côté client ou serveur. La fonction est définie comme suit :

unsigned long __RPC_USER  <type>_UserSize(
    unsigned long __RPC_FAR * pFlags,
    unsigned long StartingSize,
    <type>  __RPC_FAR *pMyObj);

Le <type> dans le nom de la fonction désigne le type utilisateur, tel que spécifié dans la définition de type [wire_marshal] ou [user_marshal]. Ce type peut être non transmissible ou même, lorsqu’il est utilisé avec l’attribut [user_marshal], inconnu du compilateur MIDL. Le nom du type de câble (nom du type transmis sur le réseau) n’est pas utilisé dans le prototype de fonction. Notez toutefois que le type de fil définit la disposition des données comme spécifié par OSF DCE. Toutes les données doivent être converties au format de représentation des données réseau (NDR).

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 format NDR tels que définis par OSF DCE pour les représentations de virgule flottante, d’octets et 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 indiquée dans le tableau suivant.

Bits Indicateur Valeur
31-24 Représentation à virgule flottante 0 = IEEE 1 = VAX 2 = Cray 3 = IBM
23-20 Ordre des octets entiers et à virgule flottante 0 = Big-endian 1 = Little-endian
19-16 Représentation de caractères 0 = ASCII 1 = EBCDIC
15-0 Indicateur de contexte de marshaling 0 = MSHCTX_LOCAL 1 = MSHCTX_NOSHAREDMEM 2 = MSHCTX_DIFFERENTMACHINE 3 = MSHCTX_INPROC

 

L’indicateur de contexte de marshaling permet de modifier le comportement de votre routine en fonction du contexte de l’appel RPC. Par exemple, si vous avez un handle (long) pour un bloc de données, vous pouvez envoyer le handle pour un appel en cours, mais vous envoyez les données réelles d’un appel à un autre ordinateur. L’indicateur de contexte de marshaling et ses valeurs sont définis dans les fichiers Wtypes.h et Wtypes.idl du Kit de développement logiciel (SDK) de plateforme.

Notes

Lorsque le type de câble est correctement défini, vous n’avez pas besoin d’utiliser les indicateurs de format NDR, car le moteur NDR effectue les conversions nécessaires.

 

Le paramètre StartingSize un est le décalage de mémoire tampon actuel. La taille de départ indique le décalage de la mémoire tampon pour l’objet utilisateur, et il peut ou non être aligné correctement. Votre routine doit tenir compte de tout remplissage nécessaire.

Le paramètre pMyObj est un pointeur vers un objet de type utilisateur.

La valeur de retour est la nouvelle position de décalage ou de mémoire tampon. La fonction doit retourner la taille cumulative, qui est la taille de départ plus le remplissage possible plus la taille des données.

La <fonction type>_UserSize peut retourner une surestimate de la taille nécessaire. La taille réelle de la mémoire tampon envoyée est définie par la taille des données, et non par la taille de l’allocation de mémoire tampon.

La <fonction type>_UserSize n’est pas appelée si la taille du câble peut être calculée au moment de la compilation. Notez que pour la plupart des unions, même s’il n’y a pas de pointeur, la taille réelle de la représentation par câble ne peut être déterminée qu’au moment de l’exécution.

Règles de marshaling pour les user_marshal et les wire_marshal

user_marshal

wire_marshal