Menggunakan Layanan Serialisasi
MIDL menghasilkan stub serialisasi untuk prosedur dengan atribut [encode] dan [dekode]. Ketika Anda memanggil rutinitas ini, Anda menjalankan panggilan serialisasi alih-alih panggilan jarak jauh. Argumen prosedur dijadikan marshaled ke atau dilepas dari buffer dengan cara yang biasa. Anda kemudian memiliki kontrol penuh atas buffer.
Sebaliknya, ketika program Anda melakukan serialisasi jenis (jenis diberi label dengan atribut serialisasi), MIDL menghasilkan rutinitas untuk ukuran, pengodean, dan dekode objek dari jenis tersebut. Untuk menserialisasikan data, Anda harus memanggil rutinitas ini dengan cara yang sesuai. Jenis serialisasi adalah ekstensi Microsoft dan, dengan demikian, tidak tersedia saat Anda mengkompilasi dalam mode kompatibilitas DCE (/osf). Dengan menggunakan atribut [encode] dan [dekode] sebagai atribut antarmuka, RPC menerapkan pengodean ke semua jenis dan rutinitas yang ditentukan dalam file IDL.
Anda harus menyediakan buffer yang cukup selaras saat menggunakan layanan serialisasi. Awal buffer harus diselaraskan pada alamat yang memiliki kelipatan 8, atau sejajar 8 byte. Untuk serialisasi prosedur, setiap panggilan prosedur harus marshal ke dalam atau unmarshal dari posisi buffer yang selaras 8-byte. Untuk serialisasi jenis, ukuran, pengodean, dan pendekodean harus dimulai pada posisi yang selaras dengan 8 byte.
Salah satu cara bagi aplikasi Anda untuk memastikan bahwa buffernya selaras adalah dengan menulis fungsi midl_user_allocate sedemikian sehingga membuat buffer yang selaras. Sampel kode berikut menunjukkan bagaimana hal ini dapat dilakukan.
#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 );
}
Contoh berikut menunjukkan fungsi midl_user_free yang sesuai.
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 );
}