Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Атрибут [context_handle] определяет дескриптор привязки, который поддерживает контекст или сведения о состоянии на сервере между удаленными вызовами процедур.
typedef [context_handle [ , type-attribute-list ] ] type-specifier declarator-list;
[context_handle [, function-attr-list ] ] type-specifier [ptr-decl] function-name(
[ [parameter-attribute-list] ] type-specifier [declarator], ...);
[ [ function-attr-list ] ] type-specifier [ ptr-decl ] function-name(
[context_handle [ , parameter-attribute-list ] ] type-specifier [declarator], ...);
[ void __RPC_USER context-handle-type_rundown (
context-handle-type); ]
Параметры
-
type-attribute-list
-
Указывает один или несколько атрибутов, которые применяются к типу.
-
описатель типа
-
Указывает тип указателя или идентификатор типа. Необязательная спецификация хранилища может предшествовать описательу типа.
-
декларатор и декларатор-list
-
Задает стандартные деклараторы C, такие как идентификаторы, деклараторы указателя и деклараторы массива. Декларатор для дескриптора контекста должен содержать по крайней мере один декларатор указателя. Дополнительные сведения см. в разделе "Массив" и "Sized-Pointer Атрибуты", " Массивы" и " Массивы" и "Указатели". Список декларатора состоит из одного или нескольких деклараторов, разделенных запятыми. Идентификатор имени параметра в деклараторе функции является необязательным.
-
function-attr-list
-
Указывает ноль или больше атрибутов, которые применяются к функции. Допустимые атрибуты функции : [обратный вызов], [local]; атрибут указателя [ref], [unique], или [ptr]; и атрибуты использования [string], [игнорировать], и [context_handle].
-
ptr-decl
-
Указывает ноль или больше деклараторов указателей. Декларатор указателя совпадает с декларатором указателя, используемым в C; он построен на основе конструктора * , модификаторов, таких как далеко, и констант квалификатора.
-
имя функции
-
Указывает имя удаленной процедуры.
-
параметр-атрибут-list
-
Задает нулевые или более направленные атрибуты, атрибуты поля, атрибуты использования и атрибуты указателя, соответствующие указанному типу параметров. Разделите несколько атрибутов запятыми.
-
тип context-handle
-
Указывает идентификатор, указывающий тип дескриптора контекста, как определено в объявлении typedef , который принимает атрибут [context_handle] . Подпрограмма запуска является необязательным.
Windows Server 2003 и Windows XP: Один интерфейс может размещать как сериализованные, так и несериализированные дескриптор контекста, что позволяет одному методу обращаться к дескриптору контекста исключительно (сериализованным), а другие методы могут обрабатывать этот контекст в общем режиме (несериализирован). Эти возможности доступа сравнимы с механизмами блокировки чтения и записи; методы, использующие сериализованный дескриптор контекста, являются эксклюзивными пользователями (средства записи), а методы, использующие несериализированный дескриптор контекста, являются общими пользователями (средствами чтения). Методы, которые уничтожают или изменяют состояние дескриптора контекста, должны быть сериализованы. Методы, которые не изменяют состояние дескриптора контекста, например те методы, которые просто считываются из дескриптора контекста, могут быть несериализированы. Обратите внимание, что методы создания неявно сериализуются.
Замечания
Атрибут [context_handle] может отображаться как атрибут типа типа IDL, как атрибут возвращаемого типа функции или в качестве атрибута параметра. При применении атрибута [context_handle] к определению типа необходимо также предоставить подпрограмму запуска контекста. Дополнительные сведения см. в подпрограмме запуска контекста сервера .
При использовании компилятора MIDL в режиме по умолчанию (/ms_ext) дескриптор контекста может быть любым типом указателя, выбранным пользователем, если он соответствует требованиям для дескрипторов контекста, описанных здесь. Данные, связанные с таким типом дескриптора контекста, не передаются в сеть и должны управляться только серверным приложением. Компиляторы IDL DCE ограничивают дескрипторы контекста указателями типа void*. Поэтому эта функция недоступна при использовании переключателя компилятора /osf MIDL.
Как и в случае с другими типами дескрипторов, дескриптор контекста непрозрачн для клиентского приложения, и все данные, связанные с ним, не передаются. На сервере дескриптор контекста служит дескриптором активного контекста, а все данные, связанные с типом дескриптора контекста, доступны.
Чтобы создать дескриптор контекста, клиент передает серверу указатель [out], [ref] в дескриптор контекста. (Сам дескриптор контекста может иметь значениеNULL или не NULL, если его значение соответствует атрибутам указателя. Например, если к типу дескриптора контекста применен атрибут [ref], он не может иметь значение NULL.) Для выполнения привязки необходимо предоставить другой дескриптор привязки, пока не будет создан дескриптор контекста. Если явный дескриптор не указан, используется неявная привязка. Если атрибут [implicit_handle] отсутствует, используется автоматический дескриптор.
Удаленная процедура на сервере создает активный дескриптор контекста. Клиент должен использовать этот дескриптор контекста в качестве параметра [in] или [in, out] в последующих вызовах. Дескриптор контекста только для [in], который можно использовать в качестве дескриптора привязки, поэтому он должен иметь значение, отличное от NULL . Дескриптор контекста только для [in]не отражает изменения состояния на сервере.
На сервере вызываемая процедура может интерпретировать дескриптор контекста по мере необходимости. Например, вызываемая процедура может выделить хранилище кучи и использовать дескриптор контекста в качестве указателя на это хранилище.
Чтобы закрыть дескриптор контекста, клиент передает дескриптор контекста в качестве аргумента [in], [out] . Сервер должен возвращать дескриптор контекста NULL , если он больше не поддерживает контекст от имени вызывающего объекта. Например, если дескриптор контекста представляет открытый файл и вызов закрывает файл, сервер должен задать дескриптор контекста значение NULL и вернуть его клиенту. Недопустимое значение NULL в качестве дескриптора привязки при последующих вызовах.
Дескриптор контекста действителен только для одного сервера. Если функция имеет два параметра дескриптора , а дескриптор контекста не NULL, дескриптор привязки должен ссылаться на одно и то же адресное пространство.
Если функция имеет маркер контекста [in] или [in, out] , его дескриптор контекста можно использовать в качестве дескриптора привязки. В этом случае неявная привязка не используется, а атрибут [implicit_handle] или [auto_handle] игнорируется.
Следующие ограничения применяются к дескрипторам контекста:
- Дескриптор контекста не может быть элементами массива, элементами структуры или членами объединения. Они могут быть только параметрами.
- Дескриптор контекста не может иметь атрибут [transmit_as] или [represent_as] .
- Параметры, указывающие на маркеры контекста [out] , должны быть указателями [ref] .
- Дескриптор контекста [in] можно использовать в качестве дескриптора привязки и не может иметь значение NULL.
- Маркер контекста [in, out может иметь значение NULL для входных данных, но только в том случае, если процедура имеет другой явный параметр дескриптора. Если нет других явных параметров дескриптора контекста , то дескриптор контекста [in, out] не может иметь значение NULL.
- С обратными вызовами нельзя использовать дескриптор контекста.
Примеры
typedef [context_handle] void * PCONTEXT_HANDLE_TYPE;
short RemoteFunc1([out] PCONTEXT_HANDLE_TYPE * pCxHandle);
short RemoteFunc2([in, out] PCONTEXT_HANDLE_TYPE * pCxHandle);
void __RPC_USER PCONTEXT_HANDLE_TYPE_rundown (PCONTEXT_HANDLE_TYPE);
См. также