Primitive und benutzerdefinierte Bindungshandles
Alle Mit dem handle_t - oder RPC_BINDING_HANDLE-Typen deklarierten Handles sind primitive Bindungshandles. Sie können die handle_t - oder RPC_BINDING_HANDLE-Typen erweitern, um mehr oder unterschiedliche Informationen als der primitive Handle-Typ enthält. Anschließend erstellen Sie ein benutzerdefiniertes Bindungshandle.
Um ein benutzerdefiniertes Bindungshandle für Ihre verteilte Anwendung zu erstellen, müssen Sie Ihren eigenen Datentyp erstellen und das Attribut [ handle] für eine Typdefinition in Ihrer IDL-Datei angeben. Letztendlich ordnen die Stubdateien benutzerdefinierte Bindungshandles primitiven Handles zu.
Wenn Sie einen eigenen Bindungshandletyp erstellen, müssen Sie auch Bindungs- und Nichtbindungsroutinen bereitstellen, die der Clientstub verwendet, um einem primitiven Handle ein benutzerdefiniertes Handle zuzuordnen. Der Stub ruft Ihre Bindungs- und Entbindungsroutinen am Anfang und Am Ende jedes Remoteprozeduraufrufs auf. Die Bindungs- und Nichtbindungsroutinen müssen den folgenden Funktionsprototypen entsprechen.
Funktionsprototyp | BESCHREIBUNG |
---|---|
handle_t type_bind(type) | Bindungsroutine |
void type_unbind(type, handle_t) | Aufheben der Bindungsroutine |
Das folgende Beispiel zeigt, wie ein benutzerdefiniertes Bindungshandle in der IDL-Datei definiert werden kann:
/* 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);
}
Wenn für die Bindungsroutine ein Fehler auftritt, sollte mithilfe der RpcRaiseException-Funktion eine Ausnahme ausgelöst werden. Der Clientstub wird dann sauber und lässt die Ausnahme in den Ausnahmeblock filtern, der den Remoteprozeduraufruf auf der Clientseite umgibt. Wenn die Bindungsroutine einfach NULL zurückgibt, erhält der Clientcode einen Fehler RPC_S_INVALID_BINDING. Während dies in bestimmten Situationen akzeptabel ist, reagieren andere Situationen (z. B. fehlender Arbeitsspeicher) nicht gut. Die nicht bindungsfähige Routine sollte so konzipiert sein, dass sie nicht fehlschlägt. Die nicht bindungsfähige Routine sollte keine Ausnahmen auslösen.
Die vom Programmierer definierten Bindungs- und nicht gebundenen Routinen werden in der Clientanwendung angezeigt. Im folgenden Beispiel ruft die Bindungsroutine RpcBindingFromStringBinding auf, um die Zeichenfolgenbindungsinformationen in ein Bindungshandle zu konvertieren. Die Unbind-Routine ruft RpcBindingFree auf, um das Bindungshandle frei zu geben.
Der Name des vom Programmierer definierten Bindungshandles, DATA_HANDLE_TYPE, wird als Teil des Namens der Funktionen angezeigt. Es wird auch als Parametertyp in den Funktionsparametern verwendet.
/* 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);
...
}
Sowohl implizite als auch explizite Bindungshandles können primitive oder benutzerdefinierte Handles sein. Das heißt, ein Handle kann wie folgt sein:
- Primitiv und implizit
- Benutzerdefiniert und implizit
- Primitiv und explizit
- Benutzerdefiniert und explizit