Megosztás a következőn keresztül:


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 );
}