Функция type_UserSize

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

unsigned long __RPC_USER  <type>_UserSize(
    unsigned long __RPC_FAR * pFlags,
    unsigned long StartingSize,
    <type>  __RPC_FAR *pMyObj);

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

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

Bits Флаг Значение
31-24 Представление с плавающей запятой 0 = IEEE 1 = VAX 2 = Cray 3 = IBM
23-20 Целочисленный и байтовый порядок с плавающей запятой 0 = Биг-эндиан 1 = Литл-эндиан
19-16 Представление символов 0 = ASCII 1 = EBCDIC
15-0 Флаг контекста маршалинга 0 = MSHCTX_LOCAL 1 = MSHCTX_NOSHAREDMEM 2 = MSHCTX_DIFFERENTMACHINE 3 = MSHCTX_INPROC

 

Флаг контекста маршалинга позволяет изменить поведение подпрограммы в зависимости от контекста вызова RPC. Например, если у вас есть дескриптор (long) для блока данных, можно отправить дескриптор для внутрипроцессного вызова, но вы будете отправлять фактические данные для вызова на другой компьютер. Флаг контекста маршалинга и его значения определяются в файлах Wtypes.h и Wtypes.idl в пакете SDK для платформенного программного обеспечения.

Примечание

Если тип провода определен правильно, вам не нужно использовать флаги формата NDR, так как подсистема недоставки выполняет необходимые преобразования.

 

Параметр StartingSize a является текущим смещением буфера. Начальный размер указывает смещение буфера для пользовательского объекта, и он может быть выровнен или не выровнен должным образом. Ваша рутина должна учитывать все необходимые заполнения.

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

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

Функция <type>_UserSize может возвращать переоценку необходимого размера. Фактический размер отправленного буфера определяется размером данных, а не размером выделения буфера.

Функция <type>_UserSize не вызывается, если размер провода можно вычислить во время компиляции. Обратите внимание, что для большинства объединений, даже если нет указателей, фактический размер представления провода можно определить только во время выполнения.

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

user_marshal

wire_marshal