Utilisation des services de sérialisation
MIDL génère un stub de sérialisation pour la procédure avec les attributs [ Encoder ] et [ décoder ] . Lorsque vous appelez cette routine, vous exécutez un appel de sérialisation au lieu d’un appel distant. Les arguments de procédure sont marshalés ou démarshalés à partir d’une mémoire tampon de la manière habituelle. Vous avez ensuite le contrôle total des mémoires tampons.
En revanche, lorsque votre programme effectue une sérialisation de type (un type est étiqueté avec des attributs de sérialisation), MIDL génère des routines pour dimensionner, encoder et décoder les objets de ce type. Pour sérialiser des données, vous devez appeler ces routines de la manière appropriée. La sérialisation de type est une extension Microsoft et, par conséquent, n’est pas disponible quand vous compilez en mode compatible DCE (/OSF). En utilisant les [ attributs encode ] et [ Decode ] comme attributs d’interface, RPC applique l’encodage à tous les types et routines définis dans le fichier IDL.
Vous devez fournir des mémoires tampons correctement alignées lors de l’utilisation des services de sérialisation. Le début de la mémoire tampon doit être aligné sur une adresse qui est un multiple de 8, ou aligné sur 8 octets. Pour la sérialisation de procédure, chaque appel de procédure doit marshaler dans ou démarshaler une position de mémoire tampon qui est alignée sur 8 octets. Pour la sérialisation de type, le dimensionnement, l’encodage et le décodage doivent commencer à une position qui est alignée sur 8 octets.
L’une des méthodes pour votre application de s’assurer que ses mémoires tampons sont alignées consiste à écrire la fonction _ _ allocate de l’utilisateur MIDL de manière à créer des mémoires tampons alignées. L’exemple de code suivant montre comment procéder.
#include <windows.h>
#define ALIGN_TO8(p) (char *)((unsigned long)((char *)p + 7) & ~7)
void __RPC_FAR *__RPC_USER MIDL_user_allocate(size_t sizeInBytes)
{
unsigned char *pcAllocated;
unsigned char *pcUserPtr;
pcAllocated = (unsigned char *) malloc( sizeInBytes + 15 );
pcUserPtr = ALIGN_TO8( pcAllocated );
if ( pcUserPtr == pcAllocated )
pcUserPtr = pcAllocated + 8;
*(pcUserPtr - 1) = pcUserPtr - pcAllocated;
return( pcUserPtr );
}
L’exemple suivant illustre la fonction de l' _ _ utilisateur MIDL correspondante.
void __RPC_USER MIDL_user_free(void __RPC_FAR *f)
{
unsigned char * pcAllocated;
unsigned char * pcUserPtr;
pcUserPtr = (unsigned char *) f;
pcAllocated = pcUserPtr - *(pcUserPtr - 1);
free( pcAllocated );
}