Bagikan melalui


Atribut transmit_as

Atribut [transmit_as] menawarkan cara untuk mengontrol marshaling data tanpa khawatir tentang marshaling data pada tingkat rendah —yaitu, tanpa khawatir tentang ukuran data atau byte yang bertukar di lingkungan heterogen. Dengan memungkinkan Anda mengurangi jumlah data yang dikirimkan melalui jaringan, atribut [transmit_as] dapat membuat aplikasi Anda lebih efisien.

Anda menggunakan atribut [transmit_as] untuk menentukan jenis data yang akan ditransmisikan oleh stub RPC melalui jaringan alih-alih menggunakan jenis data yang disediakan oleh aplikasi. Anda menyediakan rutinitas yang mengonversi jenis data ke dan dari jenis yang digunakan untuk transmisi. Anda juga harus menyediakan rutinitas untuk membebaskan memori yang digunakan untuk jenis data dan jenis yang ditransmisikan. Misalnya, berikut ini mendefinisikan xmit_type sebagai jenis data yang dikirimkan untuk semua data aplikasi yang ditentukan sebagai jenis type_spec:

typedef [transmit_as (xmit_type)] type_spec type;

Tabel berikut menjelaskan empat nama rutin yang disediakan programmer. Jenis adalah jenis data yang diketahui oleh aplikasi, dan xmit_type adalah jenis data yang digunakan untuk transmisi.

Rutin Deskripsi
type_to_xmit Mengalokasikan objek dari jenis yang ditransmisikan dan mengonversi dari jenis aplikasi ke jenis yang ditransmisikan melalui jaringan (pemanggil dan objek yang disebut).
Type_from_xmit Mengonversi dari jenis yang ditransmisikan ke jenis aplikasi (pemanggil dan objek yang dipanggil).
Type_free_inst Membebaskan sumber daya yang digunakan oleh jenis aplikasi (objek yang disebut saja).
Type_free_xmit Membebaskan penyimpanan yang dikembalikan oleh jenis*_*to_xmit rutin (pemanggil dan objek yang dipanggil).

 

Selain oleh empat fungsi yang disediakan programmer ini, jenis yang ditransmisikan tidak dimanipulasi oleh aplikasi. Jenis yang dikirimkan didefinisikan hanya untuk memindahkan data melalui jaringan. Setelah data dikonversi ke jenis yang digunakan oleh aplikasi, memori yang digunakan oleh jenis yang dikirimkan dibebaskan.

Rutinitas yang disediakan programmer ini disediakan oleh klien atau aplikasi server berdasarkan atribut arah. Jika parameter hanya [in] , klien mengirimkan ke server. Klien membutuhkan fungsi type_to_xmit dan type_free_xmit . Server membutuhkan fungsi type_from_xmit dan type_free_inst . Untuk parameter [out]-only, server mengirimkan ke klien. Aplikasi server harus menerapkan fungsi type_to_xmit dan type_free_xmit , sementara program klien harus menyediakan fungsi type_from_xmit . Untuk objek xmit_type sementara, stub akan memanggil type*_*free_xmit untuk membebaskan memori apa pun yang dialokasikan oleh panggilan ke type_to_xmit.

Pedoman tertentu berlaku untuk instans jenis aplikasi. Jika jenis aplikasi adalah penunjuk atau berisi penunjuk, maka rutin type_from_xmit harus mengalokasikan memori untuk data yang ditunjukkan oleh pointer (objek jenis aplikasi itu sendiri dimanipulasi oleh rintisan dengan cara biasa).

Untuk parameter [out] dan [in, out] out] , atau salah satu komponennya, dari jenis yang berisi atribut [transmit_as ], rutin type_free_inst secara otomatis dipanggil untuk objek data yang memiliki atribut . Untuk dalam parameter, rutin type_free_inst hanya dipanggil jika atribut [transmit_as] telah diterapkan ke parameter . Jika atribut telah diterapkan ke komponen parameter, type_free_inst rutin tidak dipanggil. Tidak ada panggilan bebas untuk data yang disematkan dan panggilan paling banyak (terkait dengan atribut tingkat atas) untuk parameter hanya dalam .

Efektif dengan MIDL 2.0, klien dan server harus menyediakan keempat fungsi. Misalnya, daftar tertaut dapat ditransmisikan sebagai array berukuran. Rutinitas type_to_xmit memandu daftar tertaut dan menyalin data yang diurutkan ke dalam array. Elemen array diurutkan sehingga banyak pointer yang terkait dengan struktur daftar tidak harus ditransmisikan. Rutinitas type_from_xmit membaca array dan menempatkan elemennya ke dalam struktur daftar tertaut.

Daftar tertaut ganda (DOUBLE_LINK_LIST) menyertakan data dan penunjuk ke elemen daftar sebelumnya dan berikutnya:

typedef struct _DOUBLE_LINK_LIST 
{
    short sNumber;
    struct _DOUBLE_LINK_LIST * pNext;
    struct _DOUBLE_LINK_LIST * pPrevious;
} DOUBLE_LINK_LIST;

Daripada mengirim struktur yang kompleks, atribut [transmit_as] dapat digunakan untuk mengirimkannya melalui jaringan sebagai array. Urutan item dalam array mempertahankan urutan elemen dalam daftar dengan biaya yang lebih rendah:

typedef struct _DOUBLE_XMIT_TYPE 
{
    short sSize;
    [size_is(sSize)] short asNumber[];
} DOUBLE_XMIT_TYPE;

Atribut [transmit_as] muncul di file IDL:

typedef [transmit_as(DOUBLE_XMIT_TYPE)]  DOUBLE_LINK_LIST DOUBLE_LINK_TYPE;

Dalam contoh berikut, ModifyListProc mendefinisikan parameter jenis DOUBLE_LINK_TYPE sebagai parameter [in, out] :

void ModifyListProc([in, out] DOUBLE_LINK_TYPE * pHead)

Empat fungsi yang ditentukan programmer menggunakan nama jenis dalam nama fungsi, dan menggunakan jenis yang disajikan dan ditransmisikan sebagai jenis parameter, sesuai kebutuhan:

void __RPC_USER DOUBLE_LINK_TYPE_to_xmit ( 
    DOUBLE_LINK_TYPE __RPC_FAR * pList, 
    DOUBLE_XMIT_TYPE __RPC_FAR * __RPC_FAR * ppArray);

void __RPC_USER DOUBLE_LINK_TYPE_from_xmit ( 
    DOUBLE_XMIT_TYPE __RPC_FAR * pArray,
    DOUBLE_LINK_TYPE __RPC_FAR * pList);

void __RPC_USER DOUBLE_LINK_TYPE_free_inst ( 
    DOUBLE_LINK_TYPE __RPC_FAR * pList);

void __RPC_USER DOUBLE_LINK_TYPE_free_xmit ( 
    DOUBLE_XMIT_TYPE __RPC_FAR * pArray);