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


Функция type_UserMarshal

Функция <type>_UserMarshal является вспомогательной для атрибутов [ wire_marshal] и [ user_marshal]. Заглушки вызывают эту функцию для маршалинга данных на стороне клиента или сервера. Функция определяется следующим образом:

unsigned char __RPC_FAR * __RPC_USER  <type>_UserMarshal(
    unsigned long __RPC_FAR * pFlags,
    unsigned char __RPC_FAR * pBuffer,
    <type>  __RPC_FAR *       pMyObj);

Тип <> в имени функции означает тип пользователя, указанный в определении типа [wire_marshal] или [user_marshal]. Этот тип может быть непередаемым или даже ( при использовании с атрибутом [user_marshal] — типом, неизвестным компилятору MIDL. Имя типа провода (имя переводимых типов) не используется в прототипе функции. Обратите внимание, что тип провода определяет структуру провода для данных, как указано в OSF DCE.

Параметр pFlags является указателем на поле длинного флага без знака. В верхнем слове флага содержатся флаги представления данных NDR в соответствии с определением OSF DCE для представлений с плавающей запятой, порядка байтов и символьных представлений. Нижнее слово содержит флаг контекста маршалинга, определенный в канале COM. Точный макет флагов в поле описан в разделе Функция type_UserSize.

Параметр pBuffer — это текущий указатель буфера. Этот указатель может быть выровнен или не выровнен по входу. Функция <type>_UserMarshal должна соответствующим образом выровнять указатель буфера, маршалировать данные и возвращать новую позицию буфера, которая является адресом первого байта после маршалированного объекта. Помните, что спецификация типа провода определяет фактическую структуру данных в буфере.

Параметр pMyObj является указателем на объект типа пользователя.

Возвращаемое значение — это новая позиция буфера, которая является адресом первого байта после несмегалированного объекта.

Переполнение буфера может произойти при неправильном вычислении размера данных и попытке маршалировать больше данных, чем ожидалось. Следует быть осторожным, чтобы избежать этой ситуации. Его можно проверка с помощью указателя, который <возвращает тип>_UserMarshal. В противном случае вы рискуете, что подсистема NDR позже вызовет исключение переполнения буфера.

Исключения должны перехватываться и обрабатываться локально, исключения не должны быть разрешены для распространения в стеке вызовов.

Правила маршалинга для user_marshal и wire_marshal

wire_marshal

user_marshal