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

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

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

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

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

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

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

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

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

  • Привязка автоматической обработки используется, если ACF отсутствует.
  • Явные дескриптора [in] или [in, out] для отдельной функции вытесняют любую неявную привязку, указанную для интерфейса.
  • Несколько примитивных дескрипторов [in] или [in, out] не поддерживаются.
  • Допускается несколько явных дескрипторов контекста [in] или [in, out].
  • Все заданные программистом параметры дескриптора, за исключением параметра 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. В режиме osf используется неявная привязка. Заданный программистом параметр дескриптора H обрабатывается как передаваемые данные.
Typedef [handle] short * MY_HDL;void proc1([in] MY_HDL H,            [in] MY_HDL p );
Первый параметр — это дескриптор привязки. Параметр H является параметром binding-handle. Второй параметр дескриптора, определяемый программистом, обрабатывается как передаваемые данные.
Typedef [context_handle] void * CTXT_HDL;void proc1([in] short s,           [in] long l,           [in] CTXT_HDL H ,           [in] char c);
Дескриптор привязки является дескриптором контекста. Параметр H является дескриптором привязки.