Sérialisation de type
Le compilateur MIDL génère jusqu’à trois fonctions pour chaque type auquel l’attribut [ encode] ou [ décod] est appliqué. Par exemple, pour un type défini par l’utilisateur nommé MyType, le compilateur génère du code pour les fonctions MyType_Encode, MyType_Decode et MyType_AlignSize. Pour ces fonctions, le compilateur écrit les prototypes dans Stub.h et le code source dans Stub_c.c. En règle générale, vous pouvez encoder un objet MyType avec MyType_Encode et décoder un objet à partir de la mémoire tampon à l’aide de MyType_Decode. MyType_AlignSize est utilisé si vous avez besoin de connaître la taille de la mémoire tampon de marshaling avant de l’allouer.
La fonction d’encodage suivante est générée par le compilateur MIDL. Cette fonction sérialise les données de l’objet pointé vers pObject, et la mémoire tampon est obtenue selon la méthode spécifiée dans le handle. Après avoir écrit les données sérialisées dans la mémoire tampon, vous contrôlez la mémoire tampon. Notez que le handle hérite des status des appels précédents et que les mémoires tampons doivent être alignées sur 8.
Pour un handle implicite :
void MyType_Encode (MyType __RPC_FAR * pObject);
Pour un handle explicite :
void MyType_Encode (handle_t Handle, MyType __RPC_FAR * pObject);
La fonction suivante désérialise les données du stockage de l’application dans l’objet pointé par pObject. Vous fournissez une mémoire tampon marshalée en fonction de la méthode spécifiée dans le handle. Notez que le handle peut hériter des status des appels précédents et que les mémoires tampons doivent être alignées à 8.
Pour un handle implicite :
void MyType_Decode (MyType __RPC_FAR * pObject);
Pour un handle explicite :
void MyType_Decode (handle_t Handle, MyType __RPC_FAR * pObject);
La fonction suivante retourne une taille, en octets, qui inclut le type instance plus tous les octets de remplissage nécessaires pour aligner les données. Cela permet de sérialiser un ensemble d’instances de types identiques ou différents dans une mémoire tampon tout en veillant à ce que les données de chaque objet soient correctement alignées. MyType_AlignSize suppose que le instance pointé par pObject sera marshalé dans une mémoire tampon commençant au décalage aligné à 8.
Pour un handle implicite :
size_t MyType_AlignSize (MyType __RPC_FAR * pObject);
Pour un handle explicite :
size_t MyType_AlignSize (handle_t Handle, MyType __RPC_FAR * pObject);
Notez que les procédures distantes avec des handles de liaison implicite et les types sérialisés avec des handles de sérialisation implicites utilisent la même variable de handle global. Par conséquent, il est conseillé de ne pas mélanger la sérialisation de type et les procédures distantes dans une interface avec des handles implicites. Pour plus d’informations, consultez Handles implicites et explicites.