wire_marshal 特性
[wire_marshal] 属性指定用于传输 (线路类型) 的数据类型,而不是 (userm 类型) 应用程序特定的数据类型。
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
-
指定要封送的用户数据类型的标识符。 只要类型说明符具有明确定义的大小,它就可以是 任何类型。 userm 类型不需要可传输,但必须是 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]。
wire-type 不能是接口指针或完整指针。 线路类型必须具有明确定义的内存大小。 有关如何封送给定线路类型的详细信息,请参阅封送规则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
);