Freigeben über


Serialisierung von Kontexthandles im gemischten Modus

Ab Windows XP kann eine einzelne Schnittstelle sowohl serialisierte als auch nicht-ialisierte Kontexthandles aufnehmen, sodass eine Methode auf einer Schnittstelle ausschließlich auf ein Kontexthandle zugreifen kann (serialisiert), während andere Methoden im freigegebenen Modus (nicht-ialisiert) auf das Kontexthandle zugreifen. Weitere Informationen zu Kontexthandles finden Sie unter den folgenden Attributen:

Die Zugriffsfunktionen für serialisierte und freigegebene Modus sind mit Lese-/Schreibsperrmechanismen vergleichbar. Methoden, die ein serialisiertes Kontexthandle verwenden, sind exklusive Benutzer (Writer), während Methoden, die ein nicht-ialisiertes Kontexthandle verwenden, freigegebene Benutzer (Reader) sind. Methoden, die den Zustand eines Kontexthandles zerstören oder ändern, müssen serialisiert werden. Methoden, die den Zustand eines Kontexthandles nicht ändern, z. B. die Methoden, die einfach aus einem Kontexthandle lesen, können nicht verwendet werden. Die Verwendung eines Kontexthandles im gemischten Modus kann die Skalierbarkeit eines Servers erheblich verbessern, insbesondere wenn mehrere Threads gleichzeitig dasselbe Kontexthandle aufrufen.

RPC erzwingt keine "Schreibsperre" für Methoden, die ein Kontexthandle im freigegebenen Modus verwenden. Dies bedeutet, dass Anwendungen sicherstellen müssen, dass Kontexthandles im freigegebenen Modus nicht geändert werden. Die Änderung eines Kontexthandles, das im freigegebenen Modus verwendet wird, kann zu subtilen Beschädigungen der Inhalte des Kontexthandles führen, die nicht zu debuggen sind.

Das Ändern der Serialisierungslogik eines Kontexthandles wirkt sich nur auf den Server aus. Außerdem wirkt sich das Ändern der Serialisierungslogik eines Kontexthandles nicht auf das Übertragungsformat aus, und daher wirken sich Änderungen an der Serialisierungslogik auf einem Server nicht auf die Fähigkeit vorhandener Clients zur Interaktion mit dem Server aus.

Es wird nicht empfohlen, nur nicht-ialisierte Kontexthandles zu verwenden. Server, die nicht-ialisierte Handles verwenden, sollten zum serialisierten Zugriff für die Methode wechseln, die das Kontexthandle schließt.

Kontexthandles, die [out]-only sind, werden in der Regel von Erstellungsmethoden verwendet und erfordern keine Serialisierung. Daher wird jedes Serialisierungsattribut, das auf [out]-only-Kontexthandles angewendet wird, z . B. context_handle_serialize oder context_handle_noserialize, von RPC ignoriert.

Hinweis

Erstellungsmethoden werden implizit serialisiert.

 

Beispiele

Die folgenden beiden Beispiele zeigen, wie Sie die Serialisierung im gemischten Modus von Kontexthandles aktivieren.

Das erste Beispiel zeigt, wie dies in der IDL-Datei geschieht:

typedef [context_handle] void *TestContextHandleExclusive;
typedef [context_handle] TestContextHandleExclusive TestContextHandleShared;

void
UseShared(...
          [in] TestContextHandleShared *Ctx,
          ...);

void
UseExclusive(...
             [in, out] TestContextHandleExclusive *Ctx,
             ...);

Das zweite Beispiel zeigt, wie Sie die Serialisierung im gemischten Modus von Kontexthandles in der ACF-Datei aktivieren:

typedef [context_handle_serialize] TestContextHandleExclusive;

typedef [context_handle_noserialize] TestContextHandleShared;

context_handle

context_handle_serialize

context_handle_noserialize