Uso dei servizi di serializzazione
MIDL genera uno stub di serializzazione per la procedura con gli attributi [codificare] e [decodificare]. Quando si chiama questa routine, si esegue una chiamata di serializzazione anziché una chiamata remota. Gli argomenti della routine vengono sottoposti a marshalling o unmarshalling da un buffer nel modo consueto. Si avrà quindi il controllo completo dei buffer.
Al contrario, quando il programma esegue la serializzazione dei tipi (un tipo viene etichettato con attributi di serializzazione), MIDL genera routine per ridimensionare, codificare e decodificare oggetti di tale tipo. Per serializzare i dati, è necessario chiamare queste routine nel modo appropriato. La serializzazione dei tipi è un'estensione Microsoft e, di conseguenza, non è disponibile quando si esegue la compilazione in modalità DCE-compatibility (/osf). Usando gli attributi [codificare] e [decodificare] come attributi dell'interfaccia, RPC applica la codifica a tutti i tipi e routine definiti nel file IDL.
È necessario fornire buffer allineati in modo adeguato quando si usano i servizi di serializzazione. L'inizio del buffer deve essere allineato a un indirizzo multiplo di 8, o allineato su 8 byte. Per la serializzazione delle procedure, ogni chiamata di procedura deve eseguire il marshalling in una posizione del buffer allineata a 8 byte o deserializzare da essa. Per la serializzazione dei tipi, il dimensionamento, la codifica e la decodifica devono iniziare in una posizione allineata a 8 byte.
Un modo per consentire all'applicazione di assicurarsi che i buffer siano allineati consiste nel scrivere la funzione midl_user_allocate in modo che crei buffer allineati. L'esempio di codice seguente illustra come eseguire questa operazione.
#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 );
}
Nell'esempio seguente viene illustrata la funzione midl_user_free corrispondente.
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 );
}