wire_marshal 屬性
[wire_marshal]屬性會指定用於傳輸 (線路類型) 的資料類型,而不是 (userm-type) 的應用程式特定資料類型。
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);
-
wire-type
-
指定在用戶端與伺服器之間實際傳輸的具名傳輸資料類型。 連線類型必須是 MIDL 基底類型、預先定義的類型,或可透過網路傳輸之類型的類型識別碼。
-
type-specifier
-
使用者類型會變成別名的類型。
-
userm-type
-
指定要封送處理之使用者資料類型的識別碼。 只要類型具有定義完善的大小,它可以是任何類型,如 類型規範所指定。 使用者類型不需要可傳輸,但必須是 MIDL 編譯器已知的類型。
-
pFlags
-
指定旗標欄位的指標, ( 不帶正負號的長) 。 高序字會指定由 DCE 所定義的 NDR 資料表示旗標,以用於浮點、大或小端和字元表示。 低序字會指定封送處理內容旗標。 旗標的確切版面配置會在 type_UserSize 函式中說明。
-
StartingSize
-
指定調整物件大小之前,目前緩衝區大小 (位移) 。
-
pUser_typeObject
-
指定userm_type物件的指標 。
-
Buffer
-
指定目前的緩衝區指標。
每個應用程式特定的資料類型 userm-type 都有一對一對應,其具有一對一的對應,該 類型 會定義型別的線標記法。 您必須提供常式來調整資料的大小以封送處理、封送處理和取消封送處理資料,以及釋放記憶體。 請注意,如果您的資料中有內嵌類型也以 [wire_marshal] 或 [user_marshal]定義,您也必須管理這些內嵌類型的服務。 如需這些常式的詳細資訊,請參閱 wire_marshal 屬性。
您的實作必須遵循 OSF-DCE 規格的封送處理規則。 如需 NDR 傳輸語法的詳細資料, https://www.opengroup.org/onlinepubs/9629399/chap14.htm 請參閱 。 如果您不熟悉有線通訊協定,不建議使用 [wire_marshal ]。
線類型不能是介面指標或完整指標。 線路類型必須具有定義完善的記憶體大小。 如需如何封送處理指定線路類型的詳細資訊,請參閱封送處理規則以取得user_marshal和wire_marshal。
userm-type不應該是介面指標,因為這些指標可以直接封送處理。 如果使用者類型是完整指標,您必須自行管理別名。
您無法直接或間接使用 [wire_marshal] 屬性搭配 [allocate] 屬性,因為 NDR 引擎不會控制傳輸類型的記憶體配置。
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
);