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);

另請參閱

ACF) (應用程式組態檔

MIDL 基底類型

long

represent_as

符號

user_marshal屬性

wire_marshal

NdrGetUserMarshalInfo