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


Расширения Binding-Handle Microsoft RPC

Расширения Майкрософт на языке IDL поддерживают несколько параметров дескриптора, которые отображаются в позициях, отличных от первого, левого, параметра. В следующих шагах описывается последовательность, которую выполняет компилятор MIDL для разрешения параметра binding-handle в режиме совместимости DCE (/osf), а также в режиме по умолчанию (расширенная корпорация Майкрософт).

Режим совместимости DCE

  • Дескриптор привязки, который отображается в первой позиции.
  • Левая [в, context_handle] параметр.
  • Неявный дескриптор привязки, заданный [implicit_handle] или [auto_handle].
  • Если ACF отсутствует, по умолчанию используется [auto_handle].

Режим по умолчанию

  • Самый левый явный дескриптор привязки.
  • Неявный дескриптор привязки, заданный [implicit_handle] или [auto_handle].
  • Если ACF отсутствует, по умолчанию используется [auto_handle].

Компиляторы IDL DCE ищут явный дескриптор привязки в качестве первого параметра. Если первый параметр не является дескриптором привязки и одним или несколькими дескрипторами контекста, то в качестве дескриптора привязки используется самый левый дескриптор контекста. Если первый параметр не является дескриптором и нет дескрипторов контекста, процедура использует неявную привязку с помощью атрибута ACF [implicit_handle] или [auto_handle].

Расширения Майкрософт для IDL позволяют дескриптор привязки находиться в позиции, отличной от первого параметра. Самый левый [в] явный дескриптор параметра , является ли он примитивным, программистом или дескриптором контекста — дескриптором привязки. Если нет параметров дескриптора, процедура использует неявную привязку с помощью атрибута ACF [implicit_handle] или [auto_handle].

Следующие правила применяются как к режиму совместимости DCE (/osf), так и к режиму по умолчанию:

  • Привязка автоматического дескриптора используется, если ACF отсутствует.
  • Явные [в] или [в, вне] обрабатывает любую неявную привязку, указанную для интерфейса.
  • Несколько [в] или [в, вне] примитивные дескрипторы не поддерживаются.
  • Допускается несколько [в] или [в, явные маркеры контекста.
  • Все определяемые программистом параметры дескриптора, кроме параметра binding-handle, обрабатываются как трансмисные данные.

В следующей таблице содержатся примеры и описывается назначение дескрипторов привязки в каждом режиме компилятора.

Пример Описание
void proc1( void );
Явный дескриптор не указан. Используется неявный дескриптор привязки, заданный [implicit_handle] или [auto_handle]. Если ACF отсутствует, используется автоматический дескриптор.
void proc2([in] handle_t H,           [in] short s );
Указан явный дескриптор типа handle_t. Параметр H — это дескриптор привязки для процедуры.
void proc3([in] short s,           [in] handle_t H );
Первый параметр не является дескриптором. В режиме по умолчанию самый левый параметр дескриптора H — это дескриптор привязки. В режиме /osf используется неявная привязка. Сообщается об ошибке, так как второй параметр, как ожидается, будет трансмисирован, и handle_t невозможно передать.
typedef [handle] short * MY_HDL;void proc1([in] short s,           [in] MY_HDL H );
Первый параметр не является дескриптором. В режиме по умолчанию самый левый параметр дескриптора H — это дескриптор привязки. Заглушки вызывают предоставленные пользователем подпрограммы MY_HDL_bind и MY_HDL_unbind. Используется неявная привязка в режиме in/osf. Заданный программистом параметр дескриптора H рассматривается как трансмисные данные.
Typedef [handle] short * MY_HDL;void proc1([in] MY_HDL H,            [in] MY_HDL p );
Первый параметр — это дескриптор привязки. Параметр H является параметром привязки. Второй параметр дескриптора, определенный программистом, обрабатывается как трансмисные данные.
Typedef [context_handle] void * CTXT_HDL;void proc1([in] short s,           [in] long l,           [in] CTXT_HDL H ,           [in] char c);
Дескриптор привязки — это дескриптор контекста. Параметр H — это дескриптор привязки.