Registrieren von Schnittstellen
In diesem Abschnitt wird der Prozess der Registrierung einer RPC-Schnittstelle ausführlich erläutert.
Die Informationen in diesem Abschnitt werden in den folgenden Themen vorgestellt:
- Schnittstellenregistrierungsfunktionen
- Einstiegspunktvektoren
- Manager-EPVs
- Registrieren einer einzelnen Implementierung einer Schnittstelle
- Registrieren mehrerer Implementierungen einer Schnittstelle
- Regeln für aufrufbare Manager-Routinen
- Senden eines Remoteprozeduraufrufs an eine Server-Manager Routine
- Bereitstellen einer eigenen Object-Inquiry-Funktion
Schnittstellenregistrierungsfunktionen
Server registrieren ihre Schnittstellen, indem sie die RpcServerRegisterIf-Funktion aufrufen. Komplexe Serverprogramme unterstützen häufig mehrere Schnittstellen. Serveranwendungen müssen diese Funktion für jede von ihnen unterstützte Schnittstelle einmal aufrufen.
Außerdem können Server mehrere Versionen derselben Schnittstelle unterstützen, die jeweils eine eigene Implementierung der Funktionen der Schnittstelle aufweisen. Wenn Ihr Serverprogramm dies tut, muss es eine Reihe von Einstiegspunkten bereitstellen. Ein Einstiegspunkt ist eine Managerroutine, die Aufrufe für eine Version einer Schnittstelle sendet. Für jede Version der Schnittstelle muss ein Einstiegspunkt vorhanden sein. Die Gruppe der Einstiegspunkte wird als Einstiegspunktvektor bezeichnet. Ausführliche Informationen finden Sie unter Einstiegspunktvektoren.
Zusätzlich zur Standardfunktion RpcServerRegisterIf unterstützt RPC auch andere Schnittstellenregistrierungsfunktionen. Die RpcServerRegisterIf2-Funktion erweitert die Funktionen von RpcServerRegisterIf , indem Sie eine Reihe von Registrierungsflags angeben können (siehe Schnittstellenregistrierungsflags), die maximale Anzahl gleichzeitiger Remoteprozeduraufrufe, die der Server akzeptieren kann, und die maximale Größe eingehender Datenblöcke in Bytes.
Die RPC-Bibliothek enthält auch eine Funktion namens RpcServerRegisterIfEx. Wie die RpcServerRegisterIf-Funktion registriert diese Funktion eine Schnittstelle. Ihr Serverprogramm kann diese Funktion auch verwenden, um eine Reihe von Registrierungsflags (siehe Schnittstellenregistrierungsflags), die maximale Anzahl gleichzeitiger Remoteprozeduraufrufanforderungen, die der Server akzeptieren kann, und eine Sicherheitsrückruffunktion anzugeben.
Die Funktionen RpcServerRegisterIf, RpcServerRegisterIfEx und RpcServerRegisterIf2 legen Werte in der Registrierungstabelle der internen Schnittstelle fest. Diese Tabelle wird verwendet, um die Schnittstellen-UUID und Objekt-UUIDs einem Manager-EPV zuzuordnen. Der Manager-EPV ist ein Array von Funktionszeigern, das genau einen Funktionszeiger für jeden Funktionsprototyp in der in der IDL-Datei angegebenen Schnittstelle enthält.
Informationen zum Bereitstellen mehrerer EPVs zum Bereitstellen mehrerer Implementierungen der Schnittstelle finden Sie unter Implementierungen mehrerer Schnittstellen.
Die Laufzeitbibliothek verwendet die Schnittstellenregistrierungstabelle (festgelegt durch Aufrufe der Funktion RpcServerRegisterIf, RpcServerRegisterIfEx oder RpcServerRegisterIf2) und die Objektregistrierungstabelle (festgelegt durch Aufrufe der Funktion RpcObjectSetType), um die Schnittstelle und Objekt-UUIDs dem Funktionszeiger zuzuordnen.
Wenn Ihr Serverprogramm eine Schnittstelle aus der RPC-Laufzeitbibliotheksregistrierung entfernen soll, rufen Sie die RpcServerUnregisterIf-Funktion auf. Nachdem die Schnittstelle aus der Registrierung entfernt wurde, akzeptiert die RPC-Laufzeitbibliothek keine neuen Aufrufe für diese Schnittstelle mehr.
Einstiegspunktvektoren
Der Manager-Einstiegspunktvektor (Manager Entry Point Vector, EPV) ist ein Array von Funktionszeigern, die auf Implementierungen der in der IDL-Datei angegebenen Funktionen verweisen. Die Anzahl der Elemente im Array entspricht der Anzahl von Funktionen, die in der IDL-Datei angegeben sind. RPC unterstützt mehrere Einstiegspunktvektoren, die mehrere Implementierungen der in der Schnittstelle angegebenen Funktionen darstellen.
Der MIDL-Compiler generiert automatisch einen Manager-EPV-Datentyp für die Verwendung beim Erstellen von Manager-EPVs. Der Datentyp heißt if-name**_SERVER_EPV**, wobei if-name den Schnittstellenbezeichner in der IDL-Datei angibt.
Der MIDL-Compiler erstellt und initialisiert automatisch einen Standard-Manager-EPV unter der Annahme, dass für jede Prozedur in der Schnittstelle eine Managerroutine mit demselben Namen vorhanden ist und in der IDL-Datei angegeben wird.
Wenn ein Server mehrere Implementierungen derselben Schnittstelle bietet, muss der Server für jede Implementierung einen zusätzlichen Manager-EPV erstellen. Jede EPV muss genau einen Einstiegspunkt (Adresse einer Funktion) für jede in der IDL-Datei definierte Prozedur enthalten. Die Serveranwendung deklariert und initialisiert eine Manager-EPV-Variable vom Typ if-name**_SERVER_EPV** für jede zusätzliche Implementierung der Schnittstelle. Um die EPVs zu registrieren, ruft er einmal RpcServerRegisterIf, RpcServerRegisterIfEx oder RpcServerRegisterIf2 für jeden unterstützten Objekttyp auf.
Wenn der Client einen Remoteprozeduraufruf an den Server ausgibt, wird der EPV mit dem Funktionszeiger basierend auf der Schnittstellen-UUID und dem Objekttyp ausgewählt. Der Objekttyp wird von der Objekt-UUID durch die Objektabfragefunktion oder die tabellengesteuerte Zuordnung abgeleitet, die von RpcObjectSetType gesteuert wird.
Manager-EPVs
Standardmäßig verwendet der MIDL-Compiler die Prozedurnamen aus der IDL-Datei einer Schnittstelle, um einen Manager-EPV zu generieren, den der Compiler direkt in den Serverstub platziert. Dieser Standard-EPV wird mithilfe der in der Schnittstellendefinition deklarierten Prozedurnamen statisch initialisiert.
Um einen Manager mithilfe des Standard-EPV zu registrieren, geben Sie NULL als Wert des MgrEpv-Parameters in einem Aufruf der Funktion RpcServerRegisterIf, RpcServerRegisterIfEx oder RpcServerRegisterIf2 an. Wenn die von einem Manager verwendeten Routinenamen denen der Schnittstellendefinition entsprechen, können Sie diesen Manager mithilfe des Standard-EPV der vom MIDL-Compiler generierten Schnittstelle registrieren. Sie können einen Manager auch mit einer EPV registrieren, die von der Serveranwendung zur Verfügung stellt.
Ein Server kann (und muss manchmal auch) einen EPV-Wert für einen Manager erstellen und registrieren, der nicht null für eine Schnittstelle ist. Um eine vom Serveranwendung bereitgestellte EPV auszuwählen, übergeben Sie die Adresse eines EPV, dessen Wert vom Server als Wert des MgrEpv-Parameters deklariert wurde. Ein Nicht-NULL-Wert für mgrEpv ein Parameter überschreibt immer einen Standard-EPV im Serverstub.
Der MIDL-Compiler generiert automatisch einen Manager-EPV-Datentyp (RPC_MGR_EPV) für eine Serveranwendung, die beim Erstellen von Manager-EPVs verwendet werden soll. Ein Manager-EPV muss genau einen Einstiegspunkt (Funktionsadresse) für jede in der IDL-Datei definierte Prozedur enthalten.
Ein Server muss in den folgenden Fällen eine EPV-Instanz ohne Null bereitstellen:
- Wenn sich die Namen von Managerroutinen von den in der Schnittstellendefinition deklarierten Prozedurnamen unterscheiden
- Wenn der Server die Standard-EPV zum Registrieren einer anderen Implementierung der Schnittstelle verwendet
Ein Server deklariert einen Manager-EPV, indem er eine Variable vom Typ if-name**_SERVER_EPV** für jede Implementierung der Schnittstelle initialisiert.
Registrieren einer einzelnen Implementierung einer Schnittstelle
Wenn ein Server nur eine Implementierung einer Schnittstelle bietet, ruft der Server RpcServerRegisterIf, RpcServerRegisterIfEx oder RpcServerRegisterIf2 nur einmal auf. Im Standardfall verwendet der Server den Standard-Manager EPV. (Ausnahme ist, wenn der Manager Routinenamen verwendet, die sich von den in der Schnittstelle deklarierten unterscheiden.)
Für den Standardfall geben Sie die folgenden Werte für Aufrufe von RpcServerRegisterIf, RpcServerRegisterIfEx oder RpcServerRegisterIf2 an:
Manager-EPVs
Um die Standard-EPV zu verwenden, geben Sie einen NULL-Wert für den MgrEpv-Parameter an.
Managertyp UUID
Registrieren Sie bei Verwendung des Standard-EPV die Schnittstelle mit einer UUID vom Typ nil manager, indem Sie entweder einen NULL-Wert oder eine null-UUID für den MgrTypeUuid-Parameter angeben. In diesem Fall werden alle Remoteprozeduraufrufe unabhängig von der Objekt-UUID in ihrem Bindungshandle an den Standard-EPV weitergeleitet, vorausgesetzt, es wurden keine RpcObjectSetType-Aufrufe ausgeführt.
Sie können auch einen Nicht-Nil-Manager vom Typ UUID bereitstellen. In diesem Fall müssen Sie auch die RpcObjectSetType-Routine aufrufen.
Registrieren mehrerer Implementierungen einer Schnittstelle
Sie können mehrere Implementierungen der Remoteprozeduren bereitstellen, die in der IDL-Datei angegeben sind. Die Serveranwendung ruft RpcObjectSetType auf, um Objekt-UUIDs zum Typ UUIDs zuzuordnen, und ruft RpcServerRegisterIf, RpcServerRegisterIfEx oder RpcServerRegisterIf2 auf, um Manager-EPVs dem Typ UUID zuzuordnen. Wenn ein Remoteprozeduraufruf mit seiner Objekt-UUID eingeht, ordnet die Laufzeitbibliothek des RPC-Servers die Objekt-UUID einer Typ-UUID zu. Die Serveranwendung verwendet dann den Typ UUID und die Schnittstellen-UUID, um den Manager-EPV auszuwählen.
Sie können auch Ihre eigene Funktion angeben, um die Zuordnung von Objekt-UUID zu Managertyp UUID aufzulösen. Sie geben die Zuordnungsfunktion an, wenn Sie RpcObjectSetInqFn aufrufen.
Um mehrere Implementierungen einer Schnittstelle anzubieten, muss ein Server jede Implementierung registrieren, indem er RpcServerRegisterIf, RpcServerRegisterIfEx oder RpcServerRegisterIf2 separat aufruft. Für jede Implementierung, die ein Server registriert, stellt er den gleichen IfSpec-Parameter , aber ein anderes Paar von MgrTypeUuid - und MgrEpv-Parametern bereit.
Verwenden Sie bei mehreren Managern RpcServerRegisterIf, RpcServerRegisterIfEx oder RpcServerRegisterIf2 wie folgt:
Manager-EPVs
Um mehrere Implementierungen einer Schnittstelle anbieten zu können, muss ein Server Folgendes ausführen:
- Erstellen Sie für jede zusätzliche Implementierung einen Nicht-NULL-Manager-EPV.
- Geben Sie einen Wert ungleich NULL für den MgrEpv-Parameter in RpcServerRegisterIf, RpcServerRegisterIfEx oder RpcServerRegisterIf2 an.
Beachten Sie, dass sich der Server auch beim Standard-Manager EPV registrieren kann.
Managertyp UUID
Geben Sie einen Managertyp UUID für jede EPV der Schnittstelle an. Die UUID vom Typ null (oder NULL-Wert ) für den MgrTypeUuid-Parameter kann für einen der Manager-EPVs angegeben werden. Jede Typ-UUID muss unterschiedlich sein.
Regeln für aufrufbare Manager-Routinen
Die RPC-Laufzeitbibliothek sendet einen eingehenden Remoteprozeduraufruf an einen Manager, der die angeforderte RPC-Schnittstelle anbietet. Wenn mehrere Manager für eine Schnittstelle registriert sind, muss die RPC-Laufzeitbibliothek einen davon auswählen. Um einen Manager auszuwählen, verwendet die RPC-Laufzeitbibliothek die Objekt-UUID, die durch das Bindungshandle des Aufrufs angegeben wird.
Die Laufzeitbibliothek wendet die folgenden Regeln an, wenn die Objekt-UUID eines Remoteprozeduraufrufs interpretiert wird:
UUIDs des Nil-Objekts
Einer UUID des Nil-Objekts wird automatisch die UUID vom Typ "null" zugewiesen (es ist unzulässig, in der RpcObjectSetType-Routine eine Nil-Objekt-UUID anzugeben). Daher wird ein Remoteprozeduraufruf, dessen Bindungshandle eine Null-Objekt-UUID enthält, automatisch an den Manager weitergeleitet, der ggf. mit der UUID vom Typ "null" registriert ist.
Nicht-Nil-Objekt-UUIDs
Im Prinzip sollte ein Remoteprozeduraufruf, dessen Bindungshandle eine Nicht-Null-Objekt-UUID enthält, von einem Manager verarbeitet werden, dessen Typ UUID dem Typ der Objekt-UUID entspricht. Die Identifizierung des richtigen Managers erfordert jedoch, dass der Server den Typ dieses Objekt-UUID durch Aufrufen der RpcObjectSetType-Routine angegeben hat.
Wenn ein Server die RpcObjectSetType-Routine für eine Nicht-Nil-Objekt-UUID nicht aufruft, geht ein Remoteprozeduraufruf für diese Objekt-UUID an die Manager-EPV, die Remoteprozeduraufrufe mit einer UUID des Nullobjekts (d. h. der UUID vom Typ null) behandelt.
Remoteprozeduraufrufe mit einer Nicht-Nil-Objekt-UUID im Bindungshandle können nicht ausgeführt werden, wenn der Server diesem Non-Nil-Objekt durch Aufrufen der RpcObjectSetType-Routine einen Typ UUID zugewiesen hat, aber nicht auch eine Manager-EPV für diesen Typ UUID registriert hat, indem RpcServerRegisterIf, RpcServerRegisterIfEx oder RpcServerRegisterIf2 aufgerufen wurde.
In der folgenden Tabelle sind die Aktionen zusammengefasst, die die Laufzeitbibliothek zum Auswählen der Managerroutine verwendet.
Objekt-UUID des Aufrufs | Serversatztyp für Objekt-UUID? | Server registrierter EPV-Typ? | Dispatching-Aktion |
---|---|---|---|
Nil | Nicht zutreffend | Ja | Verwendet den Manager mit der UUID vom Typ "null". |
Nil | Nicht zutreffend | Nein | Fehler (RPC_S_UNSUPPORTED_TYPE); lehnt den Remoteprozeduraufruf ab. |
Non-nil | Ja | Ja | Verwendet den Manager mit dem gleichen Typ UUID. |
Non-nil | Nein | Wird ignoriert. | Verwendet den Manager mit der UUID vom Typ "null". Wenn kein Manager mit der UUID vom Typ "null" vorhanden ist, fehler (RPC_S_UNSUPPORTEDTYPE); lehnt den Remoteprozeduraufruf ab. |
Non-nil | Ja | Nein | Fehler (RPC_S_UNSUPPORTEDTYPE); lehnt den Remoteprozeduraufruf ab. |
Die Objekt-UUID des Aufrufs ist die Objekt-UUID, die in einem Bindungshandle für einen Remoteprozeduraufruf gefunden wird.
Der Server legt den Typ der Objekt-UUID fest, indem RpcObjectSetType aufgerufen wird, um den Typ UUID für ein Objekt anzugeben.
Der Server registriert den Typ für den Manager-EPV, indem er RpcServerRegisterIf, RpcServerRegisterIfEx oder RpcServerRegisterIf2 mit dem gleichen Typ UUID aufruft.
Hinweis
Der UUID des Nil-Objekts wird immer automatisch die UUID vom Typ "nil" zugewiesen. Es ist unzulässig, eine Null-Objekt-UUID in der RpcObjectSetType-Routine anzugeben.
Senden eines Remoteprozeduraufrufs an eine Server-Manager-Routine
Die folgenden Tabellen zeigen die Schritte, die die RPC-Laufzeitbibliothek ausführt, um einen Remoteprozeduraufruf an eine Server-Manager-Routine zu senden.
Ein einfacher Fall, in dem der Server die Standard-Manager-EPV registriert, wird in den folgenden Tabellen beschrieben.
Schnittstellenregistrierungstabelle
Schnittstellen-UUID | Managertyp UUID | Einstiegspunktvektor |
---|---|---|
uuid1 | Nil | Standard-EPV |
Objektregistrierungstabelle
Objekt-UUID | Objekttyp |
---|---|
Nil | Nil |
(Alle anderen Objekt-UUID) | Nil |
Zuordnen des Bindungshandles zu einem Einstiegspunktvektor (EPV)
Schnittstellen-UUID (vom Clientbindungshandle) | Objekt-UUID (vom Clientbindungshandle) | Objekttyp (aus der Objektregistrierungstabelle) | Manager-EPV (aus der Schnittstellenregistrierungstabelle) |
---|---|---|---|
uuid1 | Nil | Nil | Standard-EPV |
Wie oben | uuidA | Nil | Standard-EPV |
In den folgenden Schritten werden die Aktionen beschrieben, die von der Laufzeitbibliothek des RPC-Servers ausgeführt werden, wie in den vorherigen Tabellen gezeigt, wenn sie von einem Client mit der Schnittstelle UUID uuid1 aufgerufen wird.
Der Server ruft RpcServerRegisterIf, RpcServerRegisterIfEx oder RpcServerRegisterIf2 auf, um eine Schnittstelle, die er bietet, dem Nil-Manager-Typ UUID und dem von MIDL generierten Standard-Manager-EPV zuzuordnen. Dieser Aufruf fügt einen Eintrag in der Schnittstellenregistrierungstabelle hinzu. Die Schnittstellen-UUID ist im IfSpec-Parameter enthalten.
Standardmäßig ordnet die Objektregistrierungstabelle alle Objekt-UUIDs der UUID vom Typ "null" zu. In diesem Beispiel ruft der Server RpcObjectSetType nicht auf.
Die Serverlaufzeitbibliothek empfängt einen Remoteprozedurcode, der die Schnittstellen-UUID enthält, zu der der Aufruf gehört, und die Objekt-UUID aus dem Bindungshandle des Aufrufs.
In den folgenden Funktionsreferenzeinträgen erfahren Sie, wie eine Objekt-UUID in einem Bindungshandle festgelegt wird:
Mithilfe der Schnittstellen-UUID aus dem Remoteprozeduraufruf sucht die Laufzeitbibliothek des Servers diese Schnittstellen-UUID in der Schnittstellenregistrierungstabelle.
Wenn der Server die Schnittstelle nicht mit RpcServerRegisterIf, RpcServerRegisterIfEx oder RpcServerRegisterIf2 registriert hat, wird der Remoteprozeduraufruf mit einem RPC_S_UNKNOWN_IF status Code an den Aufrufer zurückgegeben.
Mithilfe der Objekt-UUID aus dem Bindungshandle sucht die Laufzeitbibliothek des Servers diese Objekt-UUID in der Objektregistrierungstabelle. In diesem Beispiel werden alle Objekt-UUIDs dem Objekttyp nil zugeordnet.
Die Laufzeitbibliothek des Servers sucht den Typ nil manager in der Schnittstellenregistrierungstabelle.
Die Kombination der Schnittstellen-UUID und des Null-Typs in der Schnittstellenregistrierungstabelle wird in die Standard-EPV aufgelöst, die die Server-Manager-Routinen enthält, die für die im Remoteprozeduraufruf gefundene Schnittstellen-UUID ausgeführt werden sollen.
Angenommen, der Server bietet mehrere Schnittstellen und mehrere Implementierungen jeder Schnittstelle, wie in den folgenden Tabellen beschrieben.
Schnittstellenregistrierungstabelle
Schnittstellen-UUID | Manager-Typ UUID | Einstiegspunktvektor |
---|---|---|
uuid1 | Nil | epv1 |
uuid1 | uuid3 | epv4 |
uuid2 | uuid4 | epv2 |
uuid2 | uuid7 | epv3 |
Objektregistrierungstabelle
Objekt-UUID | Objekttyp |
---|---|
uuidA | uuid3 |
uuidB | uuid7 |
uuidC | uuid7 |
uuidD | uuid3 |
uuidE | uuid3 |
uuidF | uuid8 |
Nil | Nil |
(Jede andere UUID) | Nil |
Zuordnen des Bindungshandles zu einem Einstiegspunktvektor
Schnittstellen-UUID (vom Clientbindungshandle) | Objekt-UUID (aus Clientbindungshandle) | Objekttyp (aus der Objektregistrierungstabelle) | Manager EPV (aus der Schnittstellenregistrierungstabelle) |
---|---|---|---|
uuid1 | Nil | Nil | epv1 |
uuid1 | uuidA | uuid3 | epv4 |
uuid1 | uuidD | uuid3 | epv4 |
uuid1 | uuidE | uuid3 | epv4 |
uuid2 | uuidB | uuid7 | epv3 |
uuid2 | uuidC | uuid7 | epv3 |
Die folgenden Schritte beschreiben die Aktionen, die die Laufzeitbibliothek des Servers ausführt, wie in den vorherigen Tabellen gezeigt, wenn ein Client mit der Schnittstelle UUID uuid2 und der Objekt-UUID uuidC sie aufruft .
Der Server ruft RpcServerRegisterIf, RpcServerRegisterIfEx oder RpcServerRegisterIf2 auf, um die Schnittstellen, die er bietet, den verschiedenen Manager-EPVs zuzuordnen. Die Einträge in der Schnittstellenregistrierungstabelle spiegeln vier Aufrufe von RpcServerRegisterIf, RpcServerRegisterIfEx oder RpcServerRegisterIf2 wider, um zwei Schnittstellen mit zwei Implementierungen (EPVs) für jede Schnittstelle anzubieten.
Der Server ruft RpcObjectSetType auf, um den Typ jedes angebotenen Objekts festzulegen. Zusätzlich zur Standardzuordnung des nil-Objekts zu einem Nil-Typ werden auch alle anderen Objekt-UUIDs, die nicht explizit in der Objektregistrierungstabelle gefunden werden, der UUID vom Typ nil zugeordnet.
In diesem Beispiel ruft der Server die RpcObjectSetType-Routine sechsmal auf.
Die Serverlaufzeitbibliothek empfängt einen Remoteprozeduraufruf mit der Schnittstellen-UUID, zu der der Aufruf gehört, und einer Objekt-UUID aus dem Bindungshandle des Aufrufs.
Mithilfe der Schnittstellen-UUID aus dem Remoteprozeduraufruf sucht die Laufzeitbibliothek des Servers die Schnittstellen-UUID in der Schnittstellenregistrierungstabelle.
Mithilfe der UUID des UUID-Objekts aus dem Bindungshandle sucht die Laufzeitbibliothek des Servers die Objekt-UUID in der Objektregistrierungstabelle und findet, dass sie dem Typ uuid7 zugeordnet ist.
Um den Managertyp zu finden, kombiniert die Laufzeitbibliothek des Servers die Schnittstellen-UUID, uuid2 und den Typ uuid7 in der Schnittstellenregistrierungstabelle. Dadurch wird in epv3 aufgelöst, das die Server-Manager-Routine enthält, die für den Remoteprozeduraufruf ausgeführt werden soll.
Die Routinen in epv2 werden nie ausgeführt, da der Server die RpcObjectSetType-Routine nicht aufgerufen hat, um der Objektregistrierungstabelle Objekte mit dem Typ UUID uuid4 hinzuzufügen.
Ein Remoteprozeduraufruf mit der Schnittstelle UUID uuid2 und dem Objekt UUID uuidF wird mit einem RPC_S_UNKNOWN_MGR_TYPE status Code an den Aufrufer zurückgegeben, da der Server rpcServerRegisterIf,RpcServerRegisterIfEx oder RpcServerRegisterIf2 nicht aufgerufen hat, um die Schnittstelle beim Managertyp uuid8 zu registrieren.
Rückgabewerte
Diese Funktion gibt einen der folgenden Werte zurück.
Wert | Bedeutung |
---|---|
RPC_S_OK | Erfolg |
RPC_S_TYPE_ALREADY_REGISTERED | Typ UUID bereits registriert |
Bereitstellen einer eigenen Objektabfragefunktion
Betrachten Sie einen Server, der Tausende von Objekten mit vielen verschiedenen Typen verwaltet. Wann immer der Server gestartet wurde, musste die Serveranwendung die Funktion RpcObjectSetType für jedes objekt aufrufen, auch wenn Clients möglicherweise nur auf einige von ihnen verweisen (oder lange dauern, um auf sie zu verweisen). Diese Tausenden von Objekten befinden sich wahrscheinlich auf dem Datenträger, sodass das Abrufen ihrer Typen zeitaufwändig wäre. Außerdem würde die interne Tabelle, die die Objekt-UUID dem Managertyp UUID zuzuordnen, im Wesentlichen die Zuordnung duplizieren, die mit den Objekten selbst verwaltet wird.
Der Einfachheit halber enthält der RPC-Funktionssatz die Funktion RpcObjectSetInqFn. Mit dieser Funktion stellen Sie Ihre eigene Objektabfragefunktion bereit.
Als Beispiel können Sie Ihre eigene Objektabfragefunktion bereitstellen, wenn Sie Objekte 100–199 dem Typ 1, 200–299 dem Typ Nummer 2 usw. zuordnen. Die Objektabfragefunktion kann auch auf ein verteiltes Dateisystem erweitert werden, in dem die Serveranwendung nicht über eine Liste aller verfügbaren Dateien (Objekt-UUIDs) verfügt, oder wenn Objekt-UUIDs-Namensdateien im Dateisystem vorhanden sind und Sie nicht alle Zuordnungen zwischen Objekt-UUIDs und Typ-UUIDs vorab laden möchten.
Zugehörige Themen