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


Неявные дескрипторы привязки

Неявные дескрипторы привязки позволяют приложению выбрать конкретный сервер для выполнения вызовов удаленных процедур. Дополнительные сведения см. в Client-Side привязка. Они также позволяют клиентской или серверной программе использовать прошедшие проверку подлинности привязки. То есть клиент может указать информацию об аутентификации в неявном дескрипторе привязки. Библиотека времени выполнения RPC использует сведения проверки подлинности для установления аутентифицированного сеанса RPC между клиентом и сервером. Дополнительные сведения см. в разделе Безопасность.

Заметка

Неявные дескрипторы привязки не являются потокобезопасными. Рекомендуется приложениям с несколькими потоками избегать использования неявных дескрипторов связывания.

 

Когда приложение использует неявные привязки, клиент должен задать сведения о привязке, чтобы он смог создать привязку. После создания неявной привязки клиент не должен передавать дескриптор привязки удаленным процедурам. Библиотека RPC обрабатывает остальную часть механики сеанса связи.

Клиент сохраняет сведения о привязке для неявного дескриптора в глобальной переменной. Когда компилятор MIDL создает клиентский заглушечный модуль и файл заголовка из спецификации интерфейса в вашем MIDL-файле, он также создает код для глобальной переменной для дескриптора связывания. Клиентская программа инициализирует дескриптор, а затем не ссылается на него снова, пока не будет уничтожена привязка.

Вы создаете неявный дескриптор, указав атрибут [implicit_handle] в ACF для интерфейса следующим образом:

/* ACF file (complete) */
 
[
  implicit_handle(handle_t hHello)
]
interface hello
{
}

Тип handle_t, используемый в предыдущем примере, является типом данных MIDL, используемым для определения дескрипторов привязки.

После создания неявного дескриптора приложение должно использовать его в качестве параметра для функций библиотеки выполнения RPC. Не используйте неявный дескриптор в качестве параметра для удаленных вызовов процедур. В следующем примере кода показано использование неявных дескрипторов привязки.

RPC_STATUS status;
status = RpcBindingFromStringBinding(
            pszStringBinding,
            &hHello);
 
status = MyRemoteProcedure();
 
status = RpcBindingFree(hHello);
...

В предыдущем примере функции библиотеки времени выполнения RPC RpcBindingFromStringBinding и RpcBindingFree требовали, чтобы дескриптор неявной привязки был передан в их списки параметров. Однако удаленная процедура MyRemoteProcedure не была выполнена, так как она не является функцией библиотеки времени выполнения RPC.