transmit_as 属性
[transmit_as] 属性提供了一种控制数据封送处理的方法,而无需担心在低级别封送数据,也就是说,无需担心异类环境中的数据大小或字节交换。 通过减少通过网络传输的数据量, [transmit_as] 属性可以使应用程序更高效。
使用 [transmit_as] 属性指定 RPC 存根将通过网络传输的数据类型,而不是使用应用程序提供的数据类型。 提供用于将数据类型与用于传输的类型进行转换的例程。 还必须提供例程来释放用于数据类型和传输类型的内存。 例如,以下将 xmit_type 定义为指定为类型 type_spec的所有应用程序数据传输的数据类型:
typedef [transmit_as (xmit_type)] type_spec type;
下表描述了程序员提供的四个例程名称。 类型 是应用程序已知的数据类型, xmit_type 是用于传输的数据类型。
例程所返回的值 | 说明 |
---|---|
type_to_xmit | 分配传输类型的对象,并将应用程序类型转换为通过网络传输的类型, (调用方和名为) 的对象。 |
Type_from_xmit | 从传输类型转换为应用程序类型, (调用方和名为) 的对象。 |
Type_free_inst | 释放应用程序类型 (仅) 对象使用的资源。 |
Type_free_xmit | 释放 由 type*_*to_xmit 例程 (调用方和名为) 的对象返回的存储。 |
除了由程序员提供的这四个函数外,传输的类型不会由应用程序操作。 传输类型的定义只是为了通过网络移动数据。 将数据转换为应用程序使用的类型后,将释放传输类型使用的内存。
这些程序员提供的例程由客户端或服务器应用程序基于方向属性提供。 如果参数仅为 [in] ,则客户端将传输到服务器。 客户端需要 type_to_xmit 和 type_free_xmit 函数。 服务器需要 type_from_xmit 和 type_free_inst 函数。 对于 [out]-only 参数,服务器将传输到客户端。 服务器应用程序必须实现 type_to_xmit 和 type_free_xmit 函数,而客户端程序必须提供 type_from_xmit 函数。 对于临时 xmit_type 对象,存根将调用 type*_*free_xmit ,以释放调用 type_to_xmit 分配的任何内存。
某些准则适用于应用程序类型实例。 如果应用程序类型是指针或包含指针,则 type_from_xmit 例程必须为指针指向的数据分配内存, (应用程序类型对象本身由存根以常规方式) 操作。
对于包含 [transmit_as] 属性的类型的 [out] 和 [in, out] out] 参数或其组件之一,将自动为具有 属性的数据对象调用 type_free_inst 例程。 对于 in parameters,仅当 [transmit_as] 属性已应用于 参数时,才会调用 type_free_inst 例程。 如果 特性已应用于 参数的组件,则不会调用 type_free_inst 例程。 对于嵌入数据,没有释放调用,最多有一个调用 (与仅限 in 参数的顶级属性) 相关。
在 MIDL 2.0 中,客户端和服务器都必须提供所有四个函数。 例如,链接列表可以作为大小数组传输。 type_to_xmit例程遍览链接列表,并将有序数据复制到数组中。 数组元素按顺序排列,以便不必传输与列表结构关联的许多指针。 type_from_xmit例程读取数组并将其元素放入链接列表结构中。
双链接列表 (DOUBLE_LINK_LIST) 包括指向上一个和下一个列表元素的数据和指针:
typedef struct _DOUBLE_LINK_LIST
{
short sNumber;
struct _DOUBLE_LINK_LIST * pNext;
struct _DOUBLE_LINK_LIST * pPrevious;
} DOUBLE_LINK_LIST;
[transmit_as] 属性可用于将其作为数组通过网络发送,而不是传送复杂结构。 数组中的项序列以较低的成本保留列表中元素的顺序:
typedef struct _DOUBLE_XMIT_TYPE
{
short sSize;
[size_is(sSize)] short asNumber[];
} DOUBLE_XMIT_TYPE;
[transmit_as] 属性显示在 IDL 文件中:
typedef [transmit_as(DOUBLE_XMIT_TYPE)] DOUBLE_LINK_LIST DOUBLE_LINK_TYPE;
在以下示例中, ModifyListProc 将 DOUBLE_LINK_TYPE 类型的参数定义为 [in, out] 参数:
void ModifyListProc([in, out] DOUBLE_LINK_TYPE * pHead)
四个程序员定义的函数在函数名称中使用类型的名称,并根据需要使用呈现和传输的类型作为参数类型:
void __RPC_USER DOUBLE_LINK_TYPE_to_xmit (
DOUBLE_LINK_TYPE __RPC_FAR * pList,
DOUBLE_XMIT_TYPE __RPC_FAR * __RPC_FAR * ppArray);
void __RPC_USER DOUBLE_LINK_TYPE_from_xmit (
DOUBLE_XMIT_TYPE __RPC_FAR * pArray,
DOUBLE_LINK_TYPE __RPC_FAR * pList);
void __RPC_USER DOUBLE_LINK_TYPE_free_inst (
DOUBLE_LINK_TYPE __RPC_FAR * pList);
void __RPC_USER DOUBLE_LINK_TYPE_free_xmit (
DOUBLE_XMIT_TYPE __RPC_FAR * pArray);