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 *);
-
xmit-type
-
Указывает тип данных, передаваемый между клиентом и сервером.
-
type-attribute-list
-
Указывает один или несколько атрибутов, применяемых к типу. Допустимые атрибуты типа: [handle], [switch_type]; атрибут указателя [ref], [unique], или [ptr]; и атрибуты использования [string] и [ignore]. Разделяйте несколько атрибутов запятыми.
-
type-specifier
-
Указывает базовый тип, структуру, объединение, тип перечисления или идентификатор типа. Необязательная спецификация хранилища может предшествовать описательу типа.
-
Declarator-list
-
Задает стандартные деклараторы C, такие как идентификаторы, деклараторы указателей и деклараторы массива. Дополнительные сведения см. в разделе Атрибуты массива и Sized-Pointer, массивы и массивы и указатели. Список деклараторов состоит из одного или нескольких деклараторов, разделенных запятыми. Декларатор параметров в деклараторе функции, например имя параметра, является необязательным.
-
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-type на стороне клиента.
Следующие типы не могут иметь атрибут [transmit_as] :
- Дескриптора контекста (типы с атрибутом типа [context_handle] и типы, используемые в качестве параметров с атрибутом [context_handle] )
- Типы, которые являются каналами или являются производными от каналов
- Типы данных, используемые в качестве базового типа определения канала
- Параметры, которые являются указателями или разрешаются в указатели
- Параметры, которые являются соответствующими, изменяющимися или открытыми массивами
- Структуры, содержащие соответствующие массивы
- Предопределенный тип handle_t, void
Передаваемые типы должны соответствовать следующим ограничениям:
- Они не должны быть указателями или содержать указатели.
- Они не должны быть трубами или содержать трубы.
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 *);