Schnittstellenentwicklung mitHilfe von Kontexthandles
In der Regel erstellen Sie ein Kontexthandl, indem Sie das Kontexthandlattribut [ _ für ] eine Typdefinition in der IDL-Datei angeben. Die Typdefinition gibt auch implizit eine Kontext-Run-Down-Routine an, die Sie bereitstellen müssen. Wenn die Kommunikation zwischen Client und Server unterbricht, ruft die Server-Laufzeit diese Routine auf, um alle erforderlichen Bereinigungen durchzuführen. Weitere Informationen zu Kontext-Run-Down-Routinen finden Sie unter Server Context Run-down Routine.
Eine Schnittstelle, die ein Kontexthand handle verwendet, muss über ein Bindungshand handle für die erste Bindung verfügen, das ausgeführt werden muss, bevor der Server ein Kontexthand handle zurückgeben kann. Sie können ein automatisches, implizites oder explizites Bindungshand handle verwenden, um die Bindung zu erstellen und den Kontext zu erstellen.
Ein Kontexthand handle muss vom * Typ void * _ oder ein Typ sein, der in _ void auflöset. * * Das Serverprogramm gibt ihn in den erforderlichen Typ um.
Hinweis
Die Verwendung von in out für Kontexthandles wird mit Ausnahme von Routinen, die Kontexthandles [ ] schließen, nicht abgeraten. Wenn Kontextparameter behandelt, die [ inmarkiert sind, werden out verwendet, übergeben Sie kein NULL- oder nicht initialisiertes Kontexthandles vom Client ] an den Server. Stattdessen sollte ein NULL-Zeiger auf ein Kontexthand handle übergeben werden. Beachten Sie, dass kontexthandlerparameter, die [ in ] markiert sind, keine NULL-Zeiger akzeptieren.
Das folgende Fragment einer Beispielschnittstellendefinition zeigt, wie eine verteilte Anwendung ein Kontexthand handle verwenden kann, damit ein Server geöffnet wird und eine Datendatei für jeden Client aktualisiert wird.
Die Schnittstelle muss einen Remoteprozeduraufruf enthalten, um das Handle zu initialisieren und auf einen Nicht-NULL-Wert zu setzen. In diesem Beispiel führt die RemoteOpen-Funktion diesen Vorgang aus. Sie gibt das Kontexthand handle mit einem [ out-Richtungsattribut ] an. Alternativ können Sie das Kontexthand handle als Rückgabewert der Prozedur zurückgeben. In diesem Beispiel übergeben wir jedoch das Kontexthand handle über die Parameterliste.
In diesem Beispiel handelt es sich bei den Kontextinformationen um ein Dateihand handle. Der aktuelle Speicherort in der Datei wird nachverfolgt. Die Schnittstelle verpackt das Dateihand handle als Kontexthand handle und übergibt es als Parameter an Remoteprozeduraufrufe. Eine -Struktur enthält den Dateinamen und das Dateihand handle.
/* file: cxhndl.idl (fragment of interface definition file) */
typedef [context_handle] void * PCONTEXT_HANDLE_TYPE;
typedef [ref] PCONTEXT_HANDLE_TYPE * PPCONTEXT_HANDLE_TYPE;
short RemoteOpen([out] PPCONTEXT_HANDLE_TYPE pphContext,
[in, string] unsigned char * pszFile);
void RemoteRead(
[in] PCONTEXT_HANDLE_TYPE phContext,
[out, size_is(cbBuf)] unsigned char achBuf[],
[in, out] short *pcbBuf);
short RemoteClose([in, out] PPCONTEXT_HANDLE_TYPE pphContext);
Die RemoteOpen-Funktion erstellt ein gültiges Kontexthand handle, das nicht NULL ist. Er übergibt das Kontexthand handle an den Client. Nachfolgende Remoteprozeduraufrufe wie RemoteRead verwenden das Kontexthandles als In-Zeiger.
Zusätzlich zur Remoteprozedur, die das Kontexthand handle initialisiert, muss die Schnittstelle eine Prozedur enthalten, die den Serverkontext freigibt und das Kontexthand handle auf NULL legt. Im vorherigen Beispiel führt die RemoteClose-Funktion diesen Vorgang aus.