Bagikan melalui


Menggunakan Layanan Serialisasi

MIDL menghasilkan stub serialisasi untuk prosedur dengan atribut [mengodekan] dan [dekode]. Saat Anda memanggil rutinitas ini, Anda menjalankan panggilan serialisasi alih-alih panggilan jarak jauh. Argumen prosedur dimarshalling ke atau dibuka 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 mengukur, mengodekan, dan mendekode 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 diratakan pada alamat yang merupakan kelipatan 8, atau diratakan dengan 8 byte. Untuk serialisasi prosedur, setiap panggilan prosedur harus mengemas ke dalam atau memisahkan dari posisi buffer yang selaras pada 8 byte. Untuk serialisasi jenis, ukuran, pengodean, dan decoding harus dimulai pada posisi yang selaras 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 );
}