Примитивные и настраиваемые дескрипторы привязки
Все дескрипторы, объявленные с помощью типов handle_t или RPC_BINDING_HANDLE , являются примитивными дескрипторами привязки. Вы можете расширить типы handle_t или RPC_BINDING_HANDLE , чтобы они включали больше или отличались от сведений, которые содержатся в примитивных типах дескрипторов. При этом создается настраиваемый дескриптор привязки.
Чтобы создать настраиваемый дескриптор привязки для распределенного приложения, необходимо создать собственный тип данных и указать атрибут [ handle] для определения типа в IDL-файле. В конечном счете файлы заглушки сопоставляют пользовательские дескрипторы привязки с примитивными дескрипторами.
Если вы создаете собственный тип дескриптора привязки, необходимо также предоставить подпрограммы привязки и отмены привязки, которые клиентская заглушка использует для сопоставления пользовательского дескриптора с примитивным дескриптором. Заглушка вызывает подпрограммы привязки и отмены привязки в начале и конце каждого удаленного вызова процедуры. Подпрограммы bind и unbind должны соответствовать следующим прототипам функций.
Прототип функции | Описание |
---|---|
handle_t type_bind(тип) | Подпрограмма привязки |
void type_unbind(type, handle_t) | Процедура отмены привязки |
В следующем примере показано, как можно определить настраиваемый дескриптор привязки в IDL-файле:
/* usrdef.idl */
[
uuid(20B309B1-015C-101A-B308-02608C4C9B53),
version(1.0),
pointer_default(unique)
]
interface usrdef
{
typedef struct _DATA_TYPE
{
unsigned char * pszUuid;
unsigned char * pszProtocolSequence;
unsigned char * pszNetworkAddress;
unsigned char * pszEndpoint;
unsigned char * pszOptions;
} DATA_TYPE;
typedef [handle] DATA_TYPE * DATA_HANDLE_TYPE;
void UsrdefProc([in] DATA_HANDLE_TYPE hBinding,
[in, string] unsigned char * pszString);
void Shutdown([in] DATA_HANDLE_TYPE hBinding);
}
Если подпрограмма привязки обнаруживает ошибку, она должна вызвать исключение с помощью функции RpcRaiseException . Затем заглушка клиента очистится и позволить исключению выполнить фильтрацию до блока исключений, окружающего удаленный вызов процедуры на стороне клиента. Если подпрограмма привязки просто возвращает значение NULL, код клиента получает ошибку RPC_S_INVALID_BINDING. Хотя это может быть приемлемым в некоторых ситуациях, другие ситуации (например, отсутствие памяти) не отвечают должным образом. Подпрограмма без привязки должна быть разработана таким образом, чтобы она не завершалась сбоем. Подпрограмма без привязки не должна вызывать исключения.
Подпрограммы привязки, определяемые программистом, и подпрограммы без привязки отображаются в клиентском приложении. В следующем примере подпрограмма привязки вызывает RpcBindingFromStringBinding для преобразования сведений о привязке строки в дескриптор привязки. Подпрограмма без привязки вызывает RpcBindingFree, чтобы освободить дескриптор привязки.
Имя дескриптора привязки, определяемого программистом, DATA_HANDLE_TYPE, отображается как часть имени функций. Он также используется в качестве типа параметра в параметрах функции.
/* The client stub calls this _bind routine at the */
/* beginning of each remote procedure call */
RPC_BINDING_HANDLE __RPC_USER DATA_HANDLE_TYPE_bind(
DATA_HANDLE_TYPE dh1)
{
RPC_BINDING_HANDLE hBinding;
RPC_STATUS status;
unsigned char *pszStringBinding;
status = RpcStringBindingCompose(
dh1.pszUuid,
dh1.pszProtocolSequence,
dh1.pszNetworkAddress,
dh1.pszEndpoint,
dh1.pszOptions,
&pszStringBinding);
...
status = RpcBindingFromStringBinding(
pszStringBinding,
&hBinding);
...
status = RpcStringFree(&pszStringBinding);
...
return(hBinding);
}
/* The client stub calls this _unbind routine */
/* after each remote procedure call. */
void __RPC_USER DATA_HANDLE_TYPE_unbind(
DATA_HANDLE_TYPE dh1,
RPC_BINDING_HANDLE h1)
{
RPC_STATUS status;
status = RpcBindingFree(&h1);
...
}
Как неявные, так и явные дескрипторы привязки могут быть как примитивными, так и пользовательскими. То есть дескриптор может быть следующим:
- Примитивные и неявные
- Пользовательские и неявные
- Примитивные и явные
- Пользовательский и явный