Szerializálási szolgáltatások használata
A MIDL szerializálási csonkot hoz létre az eljáráshoz a [kódolási] és a [dekódolási]. Amikor meghívja ezt a rutint, távoli hívás helyett szerializálási hívást hajt végre. Az eljárásargumentumokat a rendszer a szokásos módon egy pufferbe illeszti vagy leválasztja. Ezután teljes mértékben szabályozhatja a puffereket.
Ezzel szemben, ha a program típus szerializálást végez (egy típus szerializálási attribútumokkal van megjelölve), a MIDL rutinokat hoz létre az adott típusú objektumok méretéhez, kódolásához és dekódolásához. Az adatok szerializálásához ezeket a rutinokat a megfelelő módon kell meghívnia. A típusszerializálás egy Microsoft-bővítmény, ezért nem érhető el DCE-kompatibilitási (/osf) módban történő fordításkor. A [kódolási] és a [dekódolási] attribútumok felületi attribútumként való használatával az RPC az IDL-fájlban definiált összes típusra és rutinra kódolást alkalmaz.
Szerializálási szolgáltatások használatakor megfelelően igazított puffereket kell szolgáltatnia. A puffer elejét egy olyan címre kell igazítani, amely 8-cal osztható, vagyis 8 bájt szerint igazított. Az eljárásszerializáláshoz minden eljáráshívásnak 8 bájtos igazítással rendelkező pufferpozícióból kell kijelölnie vagy abba kell marshalling adatsort. A típusszerializáláshoz a méretezésnek, a kódolásnak és a dekódolásnak 8 bájtos igazítású pozícióban kell kezdődnie.
Az alkalmazás egyik módja, hogy biztosítsa a pufferek igazítását, ha megírja a midl_user_allocate függvényt úgy, hogy igazított puffereket hoz létre. Az alábbi kódminta bemutatja, hogyan lehet ezt megtenni.
#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 );
}
Az alábbi példa a megfelelő midl_user_free függvényt mutatja be.
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 );
}