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


Подпрограмма запуска контекста сервера

Если связь прерывается, когда сервер поддерживает контекст от имени клиента, может потребоваться подпрограмма очистки для очистки состояния, поддерживаемого сервером от имени данного клиента. Эта подпрограмма очистки называется контекстной подпрограммой запуска. При разрыве подключения заглушка сервера и библиотека времени выполнения будут вызывать эту подпрограмму для каждого дескриптора контекста, открытого клиентом.

Подпрограмма выполнения контекста является обязательной и неявно объявляется и именуется при применении атрибута [context_handle] к определению типа. Сервер не будет вызывать подпрограмму запуска контекста, если атрибут [context_handle] был применен непосредственно к параметру.

Ниже приведен синтаксис подпрограммы выполнения контекста:

void __RPC_USER type-id_rundown (type-id);

Обратите внимание, что имя типа определяет имя подпрограммы запуска контекста.

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

//file: cxhndp.c (fragment of file containing remote procedures)
//The rundown routine is associated with the context handle type.  
void __RPC_USER PCONTEXT_HANDLE_TYPE_rundown(
    PCONTEXT_HANDLE_TYPE phContext)
{
    printf("Client died with an open file, closing it..\n");
    RemoteClose(&phContext);
    assert(phContext == 0);
}