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

另请参阅

分配

数据表示形式

MIDL 基类型

NdrGetUserMarshalInfo

wire_marshal 属性

transmit_as

符号

user_marshal