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