Udostępnij za pośrednictwem


Korzystanie z usług serializacji

MIDL generuje wycinkę serializacji dla procedury z atrybutami [kodować] i [dekodować]. Wywołanie tej procedury powoduje wykonanie wywołania serializacji zamiast wywołania zdalnego. Argumenty procedury są organizowane do lub rozgrywane z bufora w zwykły sposób. Następnie masz pełną kontrolę nad buforami.

Natomiast gdy program wykonuje serializację typu (typ jest oznaczony atrybutami serializacji), MIDL generuje procedury do określania rozmiaru, kodowania i dekodowania obiektów tego typu. Aby serializować dane, należy wywołać te procedury w odpowiedni sposób. Serializacja typów jest rozszerzeniem firmy Microsoft i, w związku z tym, nie jest dostępna podczas kompilowania w trybie zgodności DCE (/osf). Używając atrybutów [kodowania] i [dekodowania] jako atrybutów interfejsu, RPC stosuje kodowanie do wszystkich typów i rutyn zdefiniowanych w pliku IDL.

Podczas korzystania z usług serializacji należy dostarczyć odpowiednio dopasowane bufory. Początek buforu musi być wyrównany do adresu będącego wielokrotnością 8, czyli wyrównanego do 8 bajtów. W przypadku serializacji procedur każde wywołanie procedury musi być pakowane lub rozpakowywane z pozycji bufora, która jest wyrównana do 8 bajtów. Serializacja typów oraz określanie rozmiaru, kodowania i dekodowania muszą rozpoczynać się od pozycji, która jest wyrównana do wielokrotności 8 bajtów.

Jednym ze sposobów, aby aplikacja upewniła się, że jej bufory są wyrównane, jest napisanie funkcji midl_user_allocate tak, aby tworzyła wyrównane bufory. Poniższy przykładowy kod pokazuje, jak można to zrobić.

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

W poniższym przykładzie przedstawiono odpowiednią funkcję midl_user_free.

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