Delen via


Serialisatieservices gebruiken

MIDL genereert een serialisatiestub voor de procedure met de kenmerken [coderen] en [decoderen]. Wanneer u deze routine aanroept, voert u een serialisatie-aanroep uit in plaats van een externe aanroep. De procedureargumenten worden op de gebruikelijke manier uit een buffer gemarteld of niet gemarhaleerd. Vervolgens hebt u volledige controle over de buffers.

Als uw programma daarentegen typeserialisatie uitvoert (een type is gelabeld met serialisatiekenmerken), genereert MIDL routines om objecten van dat type te vergroten, te coderen en te decoderen. Als u gegevens wilt serialiseren, moet u deze routines op de juiste manier aanroepen. Typeserialisatie is een Microsoft-extensie en is als zodanig niet beschikbaar wanneer u compileert in dce-compatibiliteit (/osf) modus. Met behulp van de kenmerken [coderen] en [decoderen] kenmerken als interfacekenmerken, past RPC codering toe op alle typen en routines die zijn gedefinieerd in het IDL-bestand.

U moet adequaat afgestemde buffers leveren bij het gebruik van serialisatieservices. Het begin van de buffer moet uitgelijnd zijn op een adres dat een veelvoud van 8 is, oftewel 8-byte uitgelijnd. Voor procedureserialisatie moet elke procedureaanroep serialiseren naar of deserialiseren van een bufferpositie die 8-byte uitgelijnd is. Voor typeserialisatie moeten de formattering, de codering en de decodering beginnen op een positie die 8-byte gealigneerd is.

Eén manier voor uw toepassing om ervoor te zorgen dat de buffers zijn uitgelijnd, is door de midl_user_allocate functie zo te schrijven dat er uitgelijnde buffers worden gemaakt. In het volgende codevoorbeeld ziet u hoe dit kan worden gedaan.

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

In het volgende voorbeeld ziet u de bijbehorende midl_user_free functie.

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