transmit_as 特性
[transmit_as] 属性指示编译器将 type-id*,*(客户端和服务器应用程序操作的呈现类型)与传输类型 xmit-type 相关联。
typedef [transmit_as(xmit-type) [[ , type-attribute-list ]] ] type-specifier declarator-list;
void __RPC_USER type-id_to_xmit (
type-id __RPC_FAR *,
xmit-type __RPC_FAR * __RPC_FAR *);
void __RPC_USER type-id_from_xmit (
xmit-type __RPC_FAR *,
type-id __RPC_FAR *);
void __RPC_USER type-id_free_inst (
type-id __RPC_FAR *);
void __RPC_USER type-id_free_xmit (
xmit-type__RPC_FAR *);
parameters
-
xmit-type
-
指定在客户端和服务器之间传输的数据类型。
-
type-attribute-list
-
指定应用于类型的一个或多个属性。 有效的类型属性包括 [handle]、 [switch_type];指针属性 [ref]、 [unique]或 [ptr];和用法属性 [string] 和 [ignore]。 用逗号分隔多个属性。
-
type-specifier
-
declarator-list
-
指定标准 C 声明符,例如标识符、指针声明符和数组声明符。 有关详细信息,请参阅 数组和Sized-Pointer属性、 数组和 数组和指针。 declarator-list 由一个或多个用逗号分隔的声明符组成。 函数声明符中的参数声明符(如参数名称)是可选的。
-
type-id
-
指定呈现给客户端和服务器应用程序的数据类型的名称。
备注
若要使用 [transmit_as] 属性,用户必须提供在呈现类型和传输类型之间转换数据的例程;这些例程还必须释放用于保存转换的数据的内存。 [transmit_as] 属性指示存根调用用户提供的转换例程。
传输的类型 xmit-type 必须解析为 MIDL 基类型、预定义类型或类型标识符。 有关详细信息,请参阅 MIDL 基类型。
用户必须提供以下例程。
例程名称 | 说明 |
---|---|
type-id**_to_xmit** | 将数据从呈现的类型转换为传输的类型。 此例程为传输的类型以及传输类型中的指针引用的任何数据分配内存。 |
type-id**_from_xmit** | 将数据从传输的类型转换为呈现的类型。 此例程负责为所呈现类型中的指针引用的数据分配内存。 RPC 为类型本身分配内存。 |
type-id**_free_inst** | 释放为所呈现类型中的指针引用的数据分配的内存。 RPC 释放类型本身的内存。 |
type-id**_free_xmit** | 释放调用方为传输类型和传输类型中的指针引用的数据使用的存储。 |
客户端存根调用 type-id**_to_xmit** 为传输的类型分配空间,并将数据转换为 xmit-type 类型的对象。服务器存根为原始数据类型分配空间,并调用 type-id**_from_xmit** 将数据从其传输的类型转换为呈现的类型。
从应用程序代码返回后,服务器存根会调用 type-id**_free_inst** 在服务器端解除分配 type-id 的存储。 客户端存根调用 type-id**_free_xmit**,以解除分配客户端上的 xmit 类型 存储。
以下类型不能具有 [transmit_as] 属性:
- 上下文处理具有 [context_handle] 类型属性的 (类型和用作 [context_handle] 属性参数的类型)
- 属于管道或派生自管道的类型
- 用作管道定义的基类型的数据类型
- 属于指针或解析为指针的参数
- 符合数组、可变数组或开放数组的参数
- 包含符合性数组的结构
- 预定义类型 handle_tvoid
传输的类型必须符合以下限制:
- 它们不得为指针或包含指针。
- 它们不得为管道或包含管道。
示例
typedef struct _TREE_NODE_TYPE
{
unsigned short data;
struct _TREE_NODE_TYPE * left;
struct _TREE_NODE_TYPE * right;
} TREE_NODE_TYPE;
typedef [transmit_as(TREE_XMIT_TYPE)] TREE_NODE_TYPE * TREE_TYPE;
void __RPC_USER TREE_TYPE_to_xmit(
TREE_TYPE __RPC_FAR * ,
TREE_XMIT_TYPE __RPC_FAR * __RPC_FAR *);
void __RPC_USER TREE_TYPE_from_xmit (
TREE_XMIT_TYPE __RPC_FAR *,
TREE_TYPE __RPC_FAR *);
void __RPC_USER TREE_TYPE_free_inst(
TREE_TYPE __RPC_FAR *);
void __RPC_USER TREE_TYPE_free_xmit(
TREE_XMIT_TYPE __RPC_FAR *);
另请参阅