Marshaleur d’utilisateurs
Le marshalage d’utilisateurs a une chaîne de format similaire à transmit_as :
FC_USER_MARSHAL
flags<1>
quadruple_index<2>
user_type_memory_size<2>
transmitted_type_buffer size<2>
offset_to_the_transmitted_type<2>
Les indicateurs<1 octet> se composent de l’indicateur supérieur nibble et du nibble d’alignement inférieur.
Les 2 bits supérieurs de l’indicateur sont utilisés pour décrire si le type de fil est défini comme pointeur unique, pointeur de référence ou aucun pointeur (il ne peut pas s’agir d’un ptr). Les manifestes suivants ont été définis pour définir/obtenir les indicateurs :
#define USER_MARSHAL_UNIQUE 0x80
#define USER_MARSHAL_REF 0x40
#define USER_MARSHAL_POINTER 0xc0 /* unique or ref */
#define USER_MARSHAL_IID 0x20 /* JIT compiler only */
Le nibble d’alignement du mot d’indicateur conserve l’alignement du câble du type transmis.
La quadruple_index<2> est un index de la routine de rappel quadruplée des fonctions de marshalage utilisateur. Les positions de routine sont les suivantes : dimensionnement, marshaling, démarshalation et routine de libération.
Le user_type_memory_size<2> fournit une taille pour le type spécifique de l’utilisateur, y compris les types inconnus.
La transmitted_type_buffer_size<2> est égale à zéro lorsque la taille est variable ou la taille fixe réelle. Il s’agit d’une optimisation qui permet à MIDL d’ignorer les rappels lors du dimensionnement de la mémoire tampon, ainsi que lors de la libération.
Gamme
La vérification [plage] fournit des moyens supplémentaires pour la validation des arguments au niveau de la couche de remise. Le descripteur [range] a le format suivant :
FC_RANGE, flags_type <1>
low value<4>
high value<4>
Les indicateurs prennent le nibble supérieur et le type le nibble inférieur du deuxième octet. Les valeurs basses et élevées dépendent du type de la variable à vérifier.
Les drapeaux sont destinés à être un véhicule d’expansion ; le compilateur a défini le nibble sur zéro.