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

parameters

userm-type

指定要封送的用户数据类型的标识符。 userm 类型不需要可传输,也不需要是 MIDL 编译器已知的类型。

wire-type

指定在客户端和服务器之间实际传输的命名传输数据类型。 线路类型必须是 MIDL 基类型、预定义类型或可跨网络传输的类型标识符。

pFlags

指定指向标志字段 ( 无符号) 的指针。 高序字指定由 DCE 为浮点、大尾或小尾以及字符表示形式定义的 NDR 数据表示标志。 低序字指定封送上下文标志。 type_UserSize函数中介绍了标志的确切布局。

StartingSize

指定在调整对象大小之前 (偏移量) 的当前缓冲区大小。

pUser_typeObject

指定指向 userm_type 对象的指针。

Buffer

指定当前缓冲区指针。

备注

每个命名的本地类型 userm-type 都与定义该 类型的线路表示形式的线路类型 具有一对一的对应关系。 必须提供例程来调整数据大小以便封送处理、封送和取消封送数据以及释放内存。 有关这些例程的详细信息,请参阅 user_marshal 属性。 请注意,如果数据中存在也使用 user_marshal 或 [ [wire_marshal] 定义的嵌入类型,则还需要管理这些嵌入类型的服务。

线路类型不能是接口指针或完整指针。 线路类型必须具有明确定义的内存大小。 有关如何封送给定线路类型的详细信息,请参阅封送规则user_marshal和wire_marshal

userm 类型不应是接口指针,因为这些指针可以直接封送。 如果用户类型是完整指针,则必须自行管理别名。

示例

// 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 基类型

represent_as

符号

user_marshal 属性

wire_marshal

NdrGetUserMarshalInfo