atribut wire_marshal
Atribut [wire_marshal] menentukan jenis data yang akan digunakan untuk transmisi ( jenis kawat) alih-alih jenis data khusus aplikasi ( jenis pengguna).
typedef [wire_marshal(wire_type)] type-specifier userm-type;
unsigned long __RPC_USER < userm-type >_UserSize(
unsigned long __RPC_FAR *pFlags,
unsigned long StartingSize,
< userm-type > __RPC_FAR * pUser_typeObject );
unsigned char __RPC_FAR * __RPC_USER < userm-type >_UserMarshal(
unsigned long __RPC_FAR * pFlags,
unsigned char __RPC_FAR * Buffer,
< userm-type > __RPC_FAR * pUser_typeObject);
unsigned char __RPC_FAR * __RPC_USER < userm-type >_UserUnmarshal(
unsigned long __RPC_FAR * pFlags,
unsigned char __RPC_FAR * Buffer,
< userm-type > __RPC_FAR * pUser_typeObject);
void __RPC_USER < userm-type >_UserFree(
unsigned long __RPC_FAR * pFlags,
< userm-type > __RPC_FAR * pUser_typeObject);
Parameter
-
jenis kawat
-
Menentukan jenis data transfer bernama yang benar-benar ditransfer antara klien dan server. Jenis kawat harus merupakan jenis dasar MIDL, jenis yang telah ditentukan sebelumnya, atau pengidentifikasi jenis yang dapat ditransmisikan di seluruh jaringan.
-
type-specifier
-
Jenis di mana userm-type akan menjadi alias.
-
userm-type
-
Menentukan pengidentifikasi jenis data pengguna yang akan dinamai. Ini bisa berupa jenis apa pun, seperti yang diberikan oleh penentu jenis, selama memiliki ukuran yang terdefinisi dengan baik. Jenis pengguna tidak perlu ditransmisikan tetapi harus merupakan jenis yang diketahui oleh pengkompilasi MIDL.
-
pFlags
-
Menentukan penunjuk ke bidang bendera (panjangtidak ditandatangani). Kata urutan tinggi menentukan bendera representasi data NDR seperti yang didefinisikan oleh DCE untuk floating point, big- atau little-endian, dan representasi karakter. Kata urutan rendah menentukan bendera konteks marshaling. Tata letak bendera yang tepat dijelaskan dalam Fungsi type_UserSize.
-
Ukuran Awal
-
Menentukan ukuran buffer saat ini (offset) sebelum mengukur objek.
-
pUser_typeObject
-
Menentukan penunjuk ke objek userm_type.
-
Buffer
-
Menentukan penunjuk buffer saat ini.
Keterangan
Setiap jenis data khusus aplikasi, jenis pengguna, memiliki korespondensi satu-ke-satu dengan jenis kawat yang menentukan representasi kawat jenis. Anda harus menyediakan rutinitas untuk mengukur data untuk marshaling, untuk marshal dan unmarshal data, dan untuk membebaskan memori. Perhatikan bahwa jika ada jenis yang disematkan dalam data Anda yang juga ditentukan dengan [wire_marshal] atau [user_marshal], Anda juga perlu mengelola layanan jenis yang disematkan tersebut. Untuk informasi selengkapnya tentang rutinitas ini, lihat Atribut wire_marshal.
Implementasi Anda harus mengikuti aturan marsekal sesuai dengan spesifikasi OSF-DCE. Detail tentang sintaks transfer NDR dapat ditemukan di https://www.opengroup.org/onlinepubs/9629399/chap14.htm. Tidak disarankan untuk menggunakan [wire_marshal] jika Anda tidak terbiasa dengan protokol kawat.
Tipe kawat tidak boleh berupa penunjuk antarmuka atau penunjuk penuh. Jenis kawat harus memiliki ukuran memori yang terdefinisi dengan baik. Lihat Aturan Marsekal untuk user_marshal dan wire_marshal untuk detail tentang cara marshal jenis kawat tertentu.
Jenis pengguna tidak boleh menjadi penunjuk antarmuka karena ini dapat dinamai secara langsung. Jika jenis pengguna adalah penunjuk penuh, Anda harus mengelola alias sendiri.
Anda tidak dapat menggunakan atribut [wire_marshal]dengan atribut[alokasikan], baik secara langsung maupun tidak langsung, karena mesin NDR tidak mengontrol alokasi memori untuk jenis yang ditransmisikan.
Contoh
typedef unsigned long _FOUR_BYTE_DATA;
typedef struct _TWO_X_TWO_BYTE_DATA
{
unsigned short low;
unsigned short high;
} TWO_X_TWO_BYTE_DATA;
typedef [wire_marshal(TWO_X_TWO_BYTE_DATA)]
_FOUR_BYTE_DATA FOUR_BYTE_DATA;
//Marshaling functions:
// Calculate size that converted data will
// require in the buffer
unsigned long __RPC_USER FOUR_BYTE_DATA_UserSize(
ULONG __RPC_FAR * pulFlags,
ULONG __RPC_FAR ulStartingSize,
FOUR_BYTE_DATA __RPC_FAR * pul);
// Copy FOUR_BYTE_DATA into buffer as
// TWO_X_TWO_BYTE_DATA
unsigned long __RPC_USER FOUR_BYTE_DATA_UserMarshal(
ULONG __RPC_FAR *pulFlags,
char __RPC_FAR * pBufferStart,
FOUR_BYTE_DATA __RPC_FAR * pul);
// Recreate FOUR_BYTE_DATA from TWO_X_TWO_BYTE_DATA in buffer
unsigned long __RPC_USER FOUR_BYTE_DATA_UserUnmarshal(
ULONG __RPC_FAR * pulFlags,
char __RPC_FAR * pBufferStart,
FOUR_BYTE_DATA __RPC_FAR * pul);
// Nothing to do here as the engine frees the top
// node and FOUR_BYTE_DATA is a flat data type.
void __RPC_USER FOUR_BYTE_DATA_UserFree(
ULONG __RPC_FAR * pulFlags,
FOUR_BYTE_DATA __RPC_FAR * pul
);
Lihat juga