user_marshal和wire_marshal封送规则

用于封送嵌入指针类型的 OSF-DCE 规范要求在实现<类型_UserSize、<类型>>_UserMarshal和<类型>_UserUnMarshal函数时遵守以下限制。 (此处提供的规则和示例用于封送处理。但是,调整大小和取消封送例程必须遵循相同的限制) :

  • 如果 wire-type 是一个没有指针的平面类型,则相应用户类型的封送处理例程应仅根据 wire-type 的布局封送数据。 例如:

    typedef [wire_marshal (long)] void * HANDLE_HANDLE;
    

    请注意,长线类型是平面类型。 每当将HANDLE_HANDLE 对象传递给该函数时,HANDLE_HANDLE_UserMarshal函数会封送 一个长时间

  • 如果 wire-type 是指向另一种类型的指针,则相应用户类型的封送处理例程应根据线类型指向的类型布局封送数据。 NDR 引擎负责处理指针。 例如:

    typedef struct HDATA
    {
        long size;
        [size_is(size)] long * pData;
    } HDATA;
    
    typedef HDATA * WIRE_TYPE;
    typedef [wire_marshal(WIRE_TYPE)] void * HANDLE_DATA;
    

    请注意,线路类型 WIRE_TYPE是指针类型。 HANDLE_DATA_UserMarshal函数使用 HDATA 布局而不是 HDATA * 布局封送与句柄相关的数据。

  • 线路类型必须是平面数据类型或指针类型。 如果可传输类型必须是具有指针的结构 (其他类型(例如) ),请使用指向所需类型的指针作为线路类型。

这些限制的效果是,使用 [wire_marshal] 或 [user_marshal] 属性定义的类型可以自由嵌入到其他类型中。

wire_marshal

user_marshal

type_UserSize函数

type_UserMarshal 函数

Thetype_UserUnMarshalFunction

Thetype_UserFreeFunction