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