Uso dei servizi di serializzazione
MIDL genera uno stub di serializzazione per la procedura con gli attributi [codifica] e [decodifica]. Quando si chiama questa routine, si esegue una chiamata di serializzazione anziché una chiamata remota. Gli argomenti della routine vengono marshallati a o non sono stati annullati da un buffer nel modo consueto. Si dispone quindi del 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 dimensioni, codifica 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, ad esempio, non è disponibile quando si compila in modalità DCE-compatibility (/osf). Usando gli attributi [codifica] e [decodifica] come attributi dell'interfaccia, RPC applica la codifica a tutti i tipi e le routine definite 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 con più di 8 o 8 byte allineati. Per la serializzazione delle procedure, ogni chiamata di routine deve eseguire il marshalling in o annullare il marshalling da una posizione del buffer allineata a 8 byte. Per la serializzazione dei tipi, il ridimensionamento, la codifica e la decodifica devono iniziare in una posizione allineata a 8 byte.
Un modo per l'applicazione per assicurarsi che i buffer siano allineati consiste nel scrivere la funzione midl_user_allocate in modo che crei buffer allineati. Nell'esempio di codice seguente viene illustrato 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 di 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 );
}