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

指定旗標欄位的指標, ( unsignedlong) 。 高序字會指定由 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 
    );

另請參閱

分配

資料表示

MIDL 基底類型

long

NdrGetUserMarshalInfo

wire_marshal屬性

transmit_as

符號

user_marshal