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


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

Неявные дескрипторы привязки позволяют приложению выбрать конкретный сервер для выполнения удаленных вызовов процедур. Дополнительные сведения см. в разделе Привязка на стороне клиента. Они также позволяют клиентской или серверной программе использовать проверенные привязки. То есть клиент может указать сведения о проверке подлинности в дескрипторе неявной привязки. Библиотека времени выполнения 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.