Aturan Marsekal untuk user_marshal dan wire_marshal

Spesifikasi OSF-DCE untuk marshaling jenis penunjuk tersemat mengharuskan Anda mengamati batasan berikut saat menerapkan <fungsi jenis>_UserSize, <jenis>_UserMarshal, dan <jenis>_UserUnMarshal. (Aturan dan contoh yang diberikan di sini adalah untuk marshaling. Namun, rutinitas pengukuran dan pembatalan nama Anda harus mengikuti pembatasan yang sama):

  • Jika jenis kawat adalah jenis datar tanpa penunjuk, rutinitas marshaling Anda untuk jenis pengguna yang sesuai hanya boleh marshal data sesuai dengan tata letak jenis kawat. Contohnya:

    typedef [wire_marshal (long)] void * HANDLE_HANDLE;
    

    Perhatikan bahwa jenis kawat, panjang, adalah jenis datar. Fungsi HANDLE_HANDLE_UserMarshal Anda bertahan lama setiap kali objek HANDLE_HANDLE diteruskan ke objek tersebut.

  • Jika jenis kawat adalah penunjuk ke jenis lain, rutinitas marshaling Anda untuk jenis pengguna yang sesuai harus marshal data sesuai dengan tata letak untuk jenis yang dituju jenis kawat. Mesin NDR mengurus pointer. Contohnya:

    typedef struct HDATA
    {
        long size;
        [size_is(size)] long * pData;
    } HDATA;
    
    typedef HDATA * WIRE_TYPE;
    typedef [wire_marshal(WIRE_TYPE)] void * HANDLE_DATA;
    

    Perhatikan bahwa jenis kawat, WIRE_TYPE, adalah jenis penunjuk. Fungsi HANDLE_DATA_UserMarshal Anda akan menghaluskan data yang terkait dengan handel, menggunakan tata letak HDATA, bukan tata letak HDATA *.

  • Jenis kawat harus berupa jenis data datar atau jenis penunjuk. Jika jenis yang dapat ditransmisikan harus sesuatu yang lain (struktur dengan pointer, misalnya), gunakan penunjuk ke jenis yang Anda inginkan sebagai jenis kawat.

Efek dari pembatasan ini adalah bahwa jenis yang ditentukan dengan atribut [wire_marshal] atau [user_marshal] dapat disematkan secara bebas di jenis lain.

wire_marshal

user_marshal

Fungsi type_UserSize

Fungsi type_UserMarshal

Thetype_UserUnMarshalFunction

Thetype_UserFreeFunction