user_marshal屬性
user_marshal ACF 屬性會將目的語言 (userm 類型) 中具名本機類型與用戶端與伺服器之間傳輸的傳輸類型 (連線類型) 產生關聯。
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
-
指定要封送處理之使用者資料類型的識別碼。 userm-type不需要可傳輸,而且不是 MIDL 編譯器已知的類型。
-
wire-type
-
指定在用戶端與伺服器之間實際傳輸的具名傳輸資料類型。 線路類型必須是 MIDL 基底類型、預先定義的類型,或可透過網路傳輸之類型的類型識別碼。
-
pFlags
-
指定旗標欄位的指標, ( 不帶正負號的長) 。 高序單字會指定 DCE 所定義的 NDR 資料表示旗標,以用於浮點數、大到小到小,以及字元標記法。 低順序字組會指定封送處理內容旗標。 旗標的確切版面配置會在 type_UserSize 函式中說明。
-
StartingSize
-
指定調整物件大小之前 (位移) 目前的緩衝區大小。
-
pUser_typeObject
-
指定 userm_type物件的指標。
-
Buffer
-
指定目前的緩衝區指標。
每個具名本機類型 userm-type都有一對一的對應,其與定義類型之線標記法的 線類型 對應。 您必須提供常式來調整資料大小以進行封送處理、封送處理和取消封送處理資料,以及釋放記憶體。 如需這些常式的詳細資訊,請參閱 user_marshal 屬性。 請注意,如果您的資料中有內嵌類型也定義 于 user_marshal 或 [ [wire_marshal],您也必須管理這些內嵌類型的服務。
wire-type不能是介面指標或完整指標。 wire-type必須有妥善定義的記憶體大小。 如需如何封送處理指定線路類型的詳細資訊,請參閱封送處理規則以取得user_marshal和wire_marshal。
userm-type不應該是介面指標,因為這些指標可以直接封送處理。 如果使用者類型是完整指標,您必須自行管理別名。
// 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);