атрибут user_marshal
Атрибут ACF user_marshal связывает именованный локальный тип на целевом языке (userm-type) с типом передачи (wire-type), который передается между клиентом и сервером.
typedef [user_marshal(userm_type)] wire-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);
Параметры
-
userm-type
-
Указывает идентификатор пользовательского типа данных для маршалинга. Тип userm не должен быть передаваемым и не должен быть типом, известным компилятору MIDL.
-
проводной тип
-
Указывает именованный тип данных передачи, который фактически передается между клиентом и сервером. Тип провода должен быть базовым типом MIDL, предопределенным типом или идентификатором типа, который может передаваться по сети.
-
pFlags
-
Указывает указатель на поле флага ( unsignedlong). Слово высокого порядка задает флаги представления данных NDR, как определено DCE для представления с плавающей запятой, большого или маленького эндиана и символьного представления. Слово низкого порядка задает флаг контекста маршалинга. Точный макет флагов описан в разделе Функция type_UserSize.
-
StartingSize
-
Указывает текущий размер буфера (смещение) перед определением размера объекта.
-
pUser_typeObject
-
Указывает указатель на объект userm_type.
-
Буфер
-
Указывает текущий указатель буфера.
Комментарии
Каждый именованный локальный тип userm-type имеет соответствие "один к одному" с проводным типом , определяющим представление типа провода. Необходимо предоставить подпрограммы для размеров данных для маршалинга, маршалирования и отмены маршалинга данных, а также для освобождения памяти. Дополнительные сведения об этих подпрограммах см. в разделе Атрибут user_marshal. Обратите внимание, что если в данных есть внедренные типы, которые также определены с помощью user_marshal или [ [wire_marshal], необходимо также управлять обслуживанием этих внедренных типов.
Тип провода не может быть указателем интерфейса или полным указателем. Тип провода должен иметь четко определенный размер памяти. Дополнительные сведения о маршале данного типа подключения см. в статье Правила маршалинга для user_marshal и wire_marshal.
Тип userm не должен быть указателем интерфейса, так как их можно маршалировать напрямую. Если тип пользователя является полным указателем, псевдонимом необходимо управлять самостоятельно.
Примеры
// Marshal a long as a structure containing two shorts.
typedef unsigned long FOUR_BYTE_DATA;
typedef struct _TWO_X_TWO_BYTE_DATA
{
unsigned short low;
unsigned short high;
} TWO_X_TWO_BYTE_DATA;
// ACFL file
typedef [user_marshal(FOUR_BYTE_DATA)] TWO_X_TWO_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);
См. также раздел