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 类型不需要可传输,也不需要是 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);