Freigeben über


Heruntergefahrene Serverkontextroutine

Wenn die Kommunikation unterbrochen wird, während der Server den Kontext im Namen des Clients verwaltet, ist möglicherweise eine Bereinigungsroutine erforderlich, um den Zustand zu sauber, der vom Server im Namen eines bestimmten Clients verwaltet wird. Diese Bereinigungsroutine wird als heruntergefahrene Kontextroutine bezeichnet. Wenn eine Verbindung unterbrochen wird, rufen der Serverstub und die Laufzeitbibliothek diese Routine für jedes Kontexthandle auf, das vom Client geöffnet wird.

Die Ausführungsroutine für den Kontext ist erforderlich und wird implizit deklariert und benannt, wenn Sie das Attribut [context_handle] auf eine Typdefinition anwenden. Der Server ruft die Kontextausführungsroutine nicht auf, wenn das Attribut [context_handle] direkt auf einen Parameter angewendet wurde.

Die Syntax der heruntergefahrenen Kontextroutine lautet:

void __RPC_USER type-id_rundown (type-id);

Beachten Sie, dass der Typname den Namen der heruntergefahrenen Kontextroutine bestimmt.

Das folgende Codefragment stellt eine Beispielroutine für den Herunterlaufen des Kontexts dar. die remoteClose-Prozedur aufruft, die im Beispiel unter Schnittstellenentwicklung mithilfe von Kontexthandles, Serverentwicklung mithilfe von Kontexthandles und Cliententwicklung mithilfe von Kontexthandles verwendet wird. Diese Prozedur schließt das Dateihandle, gibt den der Datei zugeordneten Arbeitsspeicher frei und weist dem Kontexthandle NULL zu. Das Zuweisen von NULL ist das Ergebnis des Aufrufs der RemoteClose-Funktion und ist in einem Herunterlaufszenario nicht erforderlich. Die RPC-Laufzeit bereinigt den Zustand unabhängig davon, ob das Kontexthandle auf NULL festgelegt ist.

//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);
}