Поделиться через


wire_marshal - атрибут

Атрибут [wire_marshal] указывает тип данных, который будет использоваться для передачи ( проводной тип), а не тип данных конкретного приложения ( userm-type).

typedef [wire_marshal(wire_type)] type-specifier userm-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);

Параметры

проводной тип

Указывает именованный тип данных передачи, который фактически передается между клиентом и сервером. Тип провода должен быть базовым типом MIDL, предопределенным типом или идентификатором типа, который может передаваться по сети.

описатель типа

Тип, для которого userm-type станет псевдонимом.

userm-type

Указывает идентификатор пользовательского типа данных для маршалинга. Это может быть любой тип, заданный описателем типа, при условии, что он имеет четко определенный размер. Тип userm не должен быть передаваемым, но должен быть типом, известным компилятору MIDL.

pFlags

Указывает указатель на поле флага ( unsignedlong). Слово высокого порядка задает флаги представления данных NDR, как определено DCE для представления с плавающей запятой, большого или маленького эндиана и символьного представления. Слово низкого порядка задает флаг контекста маршалинга. Точный макет флагов описан в разделе Функция type_UserSize.

StartingSize

Указывает текущий размер буфера (смещение) перед определением размера объекта.

pUser_typeObject

Указывает указатель на объект userm_type.

Буфер

Указывает текущий указатель буфера.

Комментарии

Каждый тип данных для конкретного приложения, тип userm, имеет соответствие "один к одному" с типом wire,который определяет представление типа wire. Необходимо предоставить подпрограммы для размеров данных для маршалинга, маршалирования и отмены маршалинга данных, а также для освобождения памяти. Обратите внимание, что если в данных есть внедренные типы, которые также определены с помощью [wire_marshal] или [user_marshal], необходимо также управлять обслуживанием этих внедренных типов. Дополнительные сведения об этих подпрограммах см. в разделе Атрибут wire_marshal.

Реализация должна соответствовать правилам маршалинга в соответствии со спецификацией OSF-DCE. Подробные сведения о синтаксисе передачи NDR можно найти на странице https://www.opengroup.org/onlinepubs/9629399/chap14.htm. Не рекомендуется использовать [wire_marshal] , если вы не знакомы с протоколом подключения.

Тип провода не может быть указателем интерфейса или полным указателем. Тип провода должен иметь четко определенный размер памяти. Дополнительные сведения о маршале данного типа подключения см. в статье Правила маршалинга для user_marshal и wire_marshal.

Userm-type не должен быть указателем интерфейса, так как их можно маршалировать напрямую. Если тип пользователя является полным указателем, псевдонимом необходимо управлять самостоятельно.

Атрибут [wire_marshal] нельзя использовать с атрибутом [allocate] прямо или косвенно, так как подсистема NDR не управляет выделением памяти для передаваемого типа.

Примеры

typedef unsigned long _FOUR_BYTE_DATA;

typedef struct _TWO_X_TWO_BYTE_DATA 
{
        unsigned short low;
        unsigned short high;
} TWO_X_TWO_BYTE_DATA;

typedef [wire_marshal(TWO_X_TWO_BYTE_DATA)] 
    _FOUR_BYTE_DATA FOUR_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 
    );

См. также раздел

Выделить

Представление данных

Базовые типы MIDL

long

NdrGetUserMarshalInfo

Атрибут wire_marshal

transmit_as

Без знака

user_marshal