атрибут 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);

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

Файл конфигурации приложения (ACF)

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

long

represent_as

Без знака

Атрибут user_marshal

wire_marshal

NdrGetUserMarshalInfo