atribut user_marshal
Atribut ACF user_marshal mengaitkan jenis lokal bernama dalam bahasa target (jenis pengguna) dengan jenis transfer (jenis kawat) yang ditransfer antara klien dan server.
typedef [user_marshal(userm_type)] wire-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);
-
userm-type
-
Menentukan pengidentifikasi jenis data pengguna yang akan dinamai. Jenis pengguna tidak perlu ditransmisikan dan tidak perlu menjadi jenis yang diketahui oleh pengkompilasi MIDL.
-
jenis kawat
-
Menentukan jenis data transfer bernama yang benar-benar ditransfer antara klien dan server. Jenis kawat harus berupa jenis dasar MIDL, jenis yang telah ditentukan sebelumnya, atau pengidentifikasi jenis yang dapat ditransmisikan di seluruh jaringan.
-
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.
Setiap jenis lokal bernama, jenis pengguna, memiliki korespondensi satu-ke-satu dengan jenis kawat yang menentukan representasi kawat dari jenis tersebut. Anda harus menyediakan rutinitas untuk mengukur data untuk marshaling, untuk marshal dan unmarshal data, dan untuk membebaskan memori. Untuk informasi selengkapnya tentang rutinitas ini, lihat Atribut user_marshal. Perhatikan bahwa jika ada jenis yang disematkan dalam data Anda yang juga ditentukan dengan user_marshal atau [ [wire_marshal], Anda perlu mengelola layanan jenis yang disematkan tersebut juga.
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.
// Marshal a long as a structure containing two shorts.
typedef unsigned long FOUR_BYTE_DATA;
typedef struct _TWO_X_TWO_BYTE_DATA
{
unsigned short low;
unsigned short high;
} TWO_X_TWO_BYTE_DATA;
// ACFL file
typedef [user_marshal(FOUR_BYTE_DATA)] TWO_X_TWO_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);