-
Die
Offenlegung betrifft im Allgemeinen objektorientierte Programmiertechniken
und im Besonderen ein System zum automatischen Verfolgen von Clientreferenzen
auf einen Server.
-
Es
war bisher ein Ziel der Softwareindustrie, Standardsoftwarekomponenten
zu entwickeln, die wiederverwendet werden können und die einfach kombiniert
werden können,
um komplexe Systeme zu bilden. Es besteht die Vorstellung, dass
die von diesen Softwarekomponenten bereitgestellte Funktionalität zu einem
großen
Teil auf dieselbe Weise beschrieben werden würde, wie ein Datenblatt eine
Hardwarekomponente (z. B. einen Spezial-Telekommunikations-Chip)
beschreibt. Es wurden bisher verschiedene Objektmodelle definiert, die
einen Standard-Verbindungsmechanismus zwischen Softwarekomponenten
bereitstellen. Unter diesen Objektmodellen sind Softwarekomponenten „Objekte" in dem objektorientierten
Sinn und die Softwarekomponenten stellen „Interfaces" bereit, über die
auf ihre Funktionalität
zugegriffen werden kann. Durch Verwendung von Interfaces können Objekte
ihre Funktionalität
unabhängig
von der Implementierung der Funktionalität offenbaren. In der Programmiersprache
C++ ist ein Interface eine abstrakte Klasse, deren virtuelle Funktionen alle
rein sind. Eine reine virtuelle Funktion ist eine Funktion, die
keine Implementierung in der Klasse aufweist. Somit definiert ein
Interface lediglich die Reihenfolge der virtuellen Funktionen in
der Klasse und die Signaturen der virtuellen Funktionen, aber nicht
ihre Implementierungen. Das Folgende ist ein Beispiel für ein Interface:
-
Dieses „IShape" genannte Interface
hat drei virtuelle Funktionen: Draw, Save und Clear. Das „=0" nach der Formalparameterliste
zeigt an, dass jede virtuelle Funktion rein ist.
-
Konzepte
der Programmiersprache C++, die objektorientiertes Programmieren
unterstützen,
werden beschrieben in „The
Annotated C++ Reference Manual" von
Ellis und Stroustrup, das 1990 von der Addison-Wesley Publishing
Company veröffentlicht
wurde und hiermit als Bezug aufgenommen wird.
-
Sobald
ein Interface definiert ist, können
Programmierer Programme schreiben, um unabhängig von der Implementierung
auf die Funktionalität
zuzugreifen. Somit kann eine Implementierung geändert oder ersetzt werden,
ohne dass die Programme, die das Interface verwenden, modifiziert
werden müssen.
Zum Beispiel kann die Funktion Save (Speichern) des IShape-Interfaces
eine Implementierung aufweisen, die die Forminformationen in einer
Datei in einem lokalen Dateisystem speichert. Eine andere Implementierung
kann die Forminformationen in einem Datei-Server speichern, auf
den über
das Internet zugegriffen werden kann.
-
Um
sicherzustellen, dass eine Implementierung die korrekte Reihenfolge
und die korrekten Signaturen der Funktionen eines Interfaces bereitstellt,
erbt die Klasse, die die Interfaces implementiert, das Interface.
Das Folgende ist ein Beispiel für
eine Klassendefinition, die das IShape-Interface implementiert.
-
-
Die
erste Zeile der Klassendefinition zeigt durch das „: IShape" an, dass die Shape-Klasse
das IShape-Interface erbt. Die Auslassungspunkte zwischen den geschweiften
Klammern zeigen Quellcode an, der die virtuellen Funktionen implementiert.
Die Shape-Klasse
definiert zusätzlich
zu dem Bereitstellen einer Implementierung der von dem IShape-Interface
geerbten drei virtuellen Funktionen außerdem eine neue virtuelle Funkti on „internal_save" (d. h. führt sie
ein), die von einer der Implementierungen der anderen virtuellen
Funktionen aufgerufen werden kann. Die Shape-Klasse definiert außerdem zwei
ganzzahlige Datenelemente x und y.
-
Typische
C++-Compiler erzeugen virtuelle Funktionstabellen, um den Aufruf
virtueller Funktionen zu unterstützen.
Wenn ein Objekt für
eine Klasse instanziiert wird, erzeugt ein solcher C++-Compiler
eine Datenstruktur, die die Datenelemente des Objekts enthält und die
einen Zeiger auf eine virtuelle Funktionstabelle enthält. Die
virtuelle Funktionstabelle enthält
die Adresse jeder virtuellen Funktion, die für die Klasse definiert ist. 1 stellt
eine Musterobjektgestaltung für
ein Objekt der Shape-Klasse dar. Die Objektdatenstruktur 101 enthält einen
Zeiger auf eine virtuelle Funktionstabelle und die Datenelemente
x und y. Die virtuelle Funktionstabelle 102 enthält einen
Eintrag für
jede virtuelle Funktion. Jeder Eintrag enthält die Adresse der entsprechenden
virtuellen Funktion. Zum Beispiel enthält der erste Eintrag in der
virtuellen Funktionstabelle die Adresse der Draw-Funktion 103.
Die Reihenfolge der Referenzen in der virtuellen Funktionstabelle
ist dieselbe wie diejenige, die in dem geerbten Interface definiert
wird, auch wenn die Shape-Klasse diese drei Funktionen in einer unterschiedlichen
Reihenfolge definiert. Im Besonderen kommt die Referenz auf die
Funktion Draw zuerst, gefolgt von den Referenzen auf die Funktionen
Save und Clear.
-
Die
Vererbung von Interfaces ermöglicht,
dass Referenzen auf Objekte, die die Interfaces implementieren,
auf eine von der Implementierung unabhängigen Weise weitergeleitet
werden können.
Eine Routine, die eine Implementierung verwendet, kann ein formales
Argument definieren, dass ein Zeiger auf das IShape-Interface ist.
Dem Entwickler der Routine könnte
nicht bekannt sein, dass die Implementierung tatsächlich die
Shape-Klasse ist. Um eine Referenz auf ein Objekt der Shape-Klasse
weiterzuleiten, würde
ein Programm, dass die Routine aufruft, den Typ eines Zeigers auf
das Objekt der Shape-Klasse zu einem Zeiger auf das IShape-Interface
umwandeln. Solange der Zeiger auf einen Ort zeigt, der die Adresse
der virtuellen Funktionstabelle enthält, und die virtuelle Funktionstabelle
die Einträge
in der spezifizierten Reihenfolge enthält, kann die aufgerufene Routine
korrekt auf die von dem IShape-Interface definierten virtuellen
Funktionen zugreifen.
-
Ein
populäres
Objektmodell, das einen Mechanismus zum Verbinden von Komponenten
spezifiziert, ist das Component Object Model („COM") von Microsoft. COM wird in dem 1997
von Microsoft Press veröffentlichten „Inside
COM" von Dale Rogerson
ausführlicher
beschrieben. COM spezifiziert, dass jedes Objekt ein Interface implementieren
muss, das als das IUknown-Interface bezeichnet wird. Das IUnknown-Interface
stellt eine Abfrage-Interfacefunktion (Querylnterface), eine Referenzhinzufügungsfunktion
(AddRef) und eine Ausgabefunktion (Release) bereit. Der Abfrage-Interfacefunktion
wird der Identifier eines Interfaces, das das Objekt unterstützt, zugeleitet
und sie sendet eine Referenz auf das Interface zurück. Die
Funktionen AddRef und Release werden zur Referenzzählung des
Objekts verwendet. Jedes Objekt, das COM entspricht, implementiert
das IUknown-Interface.
-
Ein
Clientobjekt, das das Instanziieren eines COM-Objekts anfordert,
kann im Gegenzug einen Zeiger auf das IUknown-Interface empfangen.
Der Client kann dann die Abfrage-Interfacefunktion
aufrufen, indem der Identifier eines anderen Interfaces, das durch
dieses COM-Objekt unterstützt
wird, weitergeleitet wird. Die Abfrage-Interfacefunktion sendet
einen Zeiger auf das angeforderte Interface zurück. Der Client kann dann den Zeiger
verwenden, um eine der Funktionen des angeforderten Interfaces aufzurufen.
Wie oben erwähnt,
erbt jedes Interface eines COM-Objekts das IUknown-Interface. Somit
stellt jedes dieser Interfaces Zugriff auf andere Interfaces bereit
und stellt Referenzzählung
bereit. Immer dann, wenn ein Client einen Zeiger auf ein Interface
eines COM-Objekts dupliziert, wird von dem Client erwartet, die
Referenzhinzufügungsfunktion
aufzurufen, die die Referenzzählung
zu diesem COM-Objekt inkrementiert. Immer dann, wenn ein Client
einen Zeiger auf ein Interface zu einem COM-Objekt nicht mehr benötigt, wird
von dem Client erwartet, die Ausgabefunktion aufzurufen, die die
Referenzzählung
zu diesem COM-Objekt dekrementiert und das COM-Objekt zerstört, wenn
die Referenzzählung
auf 0 geht.
-
2A ist
ein Blockdiagramm, das herkömmliche
Verbindungen zwischen einem Serverobjekt und Clientobjekten darstellt.
Bei diesem Beispiel enthält
das Serverobjekt 2A01 ein Interface 2A02. Sobald
das Serverobjekt instanziiert ist, können verschiedene Clientobjekte 2A03 bis 2A06 unter
Verwendung der Abfrage-Interfacefunktion einen Zeiger auf ein Interface
des Serverobjekts anfordern. Dem Serverobjekt kann es unmöglich sein,
festzustellen, welches Clientobjekt eine Funktion des Interfaces
aufruft. Wenn zum Beispiel das Clientobjekt 2A03 eine Funktion
aufruft, kann das Serverobjekt nicht bestimmen, ob es das Clientobjekt 2A03 oder
das Clientobjekt 2A04 ist, das die Funktion aufruft. Einige
Serverobjekte können
so entwickelt sein, dass sie das einzelne Clientobjekt, das eine
Funktion aufruft, feststellen können.
Solche Serverobjekte können
jedes Clientobjekt mit seinem eigenen Identifier versehen. Zum Beispiel
kann, nachdem ein Clientobjekt eine Abfrage-Interfacefunktion des
Serverobjekts aufruft, um einen Zeiger auf ein Interface abzurufen,
das Clientobjekt per Konvention dann eine Funktion dieses Interfaces
aufrufen, wobei diese einen eindeutigen Identifier für dieses
Clientobjekt zurücksendet.
Wenn das Clientobjekt nachfolgend eine Funktion des Interfaces aufruft,
leitet das Clientobjekt seine eindeutige Kennung so weiter, dass
das Serverobjekt jeden Client, der eine Funktion aufruft, eindeutig
feststellen kann.
-
Solche
Serverobjekte, die Clients eindeutig feststellen können, weisen
einige Nachteile auf. Erstens sind die Kosten der Entwicklung solcher
Serverobjekte auf Grund des zusätzlichen
Codes, der zum Unterstützen
der eindeutigen Kennungen von Clientobjekten erforderlich ist, erhöht. Zweitens
muss jedes Clientobjekt dazu programmiert werden, seine eindeutige
Kennung zu empfangen und bereitzustellen. Es wäre wünschenswert, eine Technik zu
haben, bei der bestehende Serverobjekte so verwendet werden können, dass
jedes Clientobjekt einzeln festgestellt werden kann, wenn es eine
Funktion aufruft. Es wäre
außerdem
nützlich, wenn
eine solche Technik keine Modifizierung an bestehenden Serverklassendefinitionen
und Clientklassendefinitionen erfordern würde.
-
2B stellt
ein typisches Erben einer Serverklasse (d. h. Server) durch eine
Ableitungs-Serverklasse (d. h. DServer) dar. Bei diesem Beispiel
erbt eine Instanz der Serverklasse 2B01 das IUnknown-Interface
und enthält
Datenelemente 2B02 und Funktionselemente 2B03.
Die Funktionselemente können
die Funktionen der IUknown-Interface
und verschiedene andere Funktionen (z. B. func1) enthalten. Die
DServer-Klasse 2B04 erbt die
Serverklasse und enthält
Datenelemente 2B05 und Funktion 2B06. Die Datenelemente
enthalten die geerbten Datenelemente von der Serverklasse und andere
Datenelemente, die in die DServer-Klasse eingeführt werden können. Die
Funktionen enthaften die geerbten Funktionen von der Serverklasse
und andere Funktionen, die in die DServer-Klasse eingeführt werden
können.
Die DServer-Klasse stellt Implementierungen für jede eingeführte Funktion
bereit und kann übergeordnete
Implementierungen für
die geerbten Funktionen bereitstellen.
-
WO
94/11810 beschreibt ein Computerverfahren und -system zum Weiterleiten
eines Zeigers auf ein Interface von einem Serverprozess zu einem
Clientprozess. Bei einer bevorzugten Ausführung instanziiert der Serverprozess
ein Objekt, das mehrere Interfaces aufweist. Der Serverprozess stellt
ein Interface zum Weiterleiten zu dem Clientprozess fest und erzeugt
ein Stub-Objekt zum Empfangen einer Anforderung zum Aufrufen eines
Funktionselements des Interfaces und zum Aufrufen des angeforderten
Funktionselements bei Empfangen der Anforderung. Der Serverprozess
sendet dann einen Identifier des Stub zu dem Clientprozess. Wenn der
Clientprozess den Identifier des Stub empfängt, instanziiert er ein Proxy-Objekt
zum Empfangen von Anforderungen zum Aufrufen eines Funktionselements
des Interfaces und zum Senden der Anforderung zu dem festgestellten
Stub. Der Clientprozess kann dann die Funktionselemente des Interfaces
durch Aufrufen von Funktionselementen des Proxy-Objekts aufrufen.
Das Proxy-Objekt
sendet eine Anforderung zu dem festgestellten Stub. Der festgestellte
Stub ruft dann das entsprechende Funktionselement des Interfaces
auf.
-
Es
ist die Aufgabe der vorliegenden Erfindung, ein Verfahren und System
zum Verfolgen von Zugriff auf ein Serverobjekt durch einen Client
für jeden
einzelnen Client bereitzustellen, wobei das Serverobjekt Referenzen
für Clients über eine
Abfragefunktion bereitstellt.
-
Diese
Aufgabe wird durch den Gegenstand der unabhängigen Ansprüche erfüllt. Bevorzugte
Ausführungen
sind der Gegenstand der abhängigen
Ansprüche.
-
Nach
der vorliegenden Erfindung wird ein Verfahren und System zum Verfolgen
von Zugriff auf ein Serverobjekt einer Serverklasse durch Clients
bereitgestellt. Bei einer Ausführung
stellt das Clientverfolgungssystem eine abgeleitete Clientverfolgungs-Serverklasse bereit,
die eine übergeordnete
Implementierung einer Abfragefunktion der Serverklasse einschließt. Die übergeordnete
Implementierung instanziiert ein Phantom-Serverobjekt und sendet einen Zeiger
auf das instanziierte Phantom-Serverobjekt zurück. Das Phantom-Serverobjekt
weist Funktionen auf, die den Funktionen der Serverklasse entsprechen
und diesen übergeordnet
sind. Diese übergeordneten
Funktionen führen
spezifische Verarbeitung für
jeden einzelnen Client durch und leiten ihren Aufruf zu den entsprechenden
Funktionen des Serverobjekts weiter. Wenn ein Client die Abfragefunktion des
Clientverfolgungs-Serverobjekts aufruft, wird ein Zeiger auf ein
Phan tom-Serverobjekt zurückgesendet. Von
da ab kann, wenn dieser Client eine Funktion des Phantom-Serverobjekts
aufruft, spezifische Verarbeitung für diesen Client durchgeführt werden.
-
Bei
einer Ausführung
spezifiziert das Clientverfolgungssystem eine Phantom-Managerklasse
zum Steuern der Instanziierung und Zerstörung der Phantom-Serverobjekte.
Die Phantom-Managerklasse kann eine Erzeugungsfunktion bereitstellen,
die, wenn sie von der Abfragefunktion des Clientverfolgungs-Serverobjekts
aufgerufen wird, ein Phantom-Serverobjekt
instanziiert und einen Zeiger auf das Phantom-Serverobjekt zurücksendet.
Die Phantom-Managerklasse kann außerdem eine Phantom-Going-away-Funktion
bereitstellen, die, wenn sie von einem Destruktor eines Phantom-Serverobjekts
aufgerufen wird, spezifische Verarbeitung bei Zerstörung eines
Phantom-Serverobjekts durchführt.
Ein Entwickler, der Clientzugriffe auf eine bereits definierte Serverklasse
verfolgen will, kann eine Ableitung der Serverklasse spezifizieren,
die als eine „Clientverfolgungs-Serverklasse" bezeichnet wird.
Der Entwickler kann eine übergeordnete
Funktion der Abfragefunktion als Teil der Clientverfolgungs-Serverklasse
bereitstellen. Der Entwickler kann außerdem eine Implementierung
der Erzeugungsfunktion und der Phantom-Goingaway-Funktion der Phantom-Managerklasse
bereitstellen, die auf die Serverklasse zugeschnitten sind. Zusätzlich kann
der Entwickler Implementierungen der Funktionen der Serverklasse
als Teil des Phantom-Serverobjekts bereitstellen. Diese Implementierungen
von Funktionen des Phantom-Serverobjekts können die gewünschte spezifische
Verarbeitung für
jeden einzelnen Client durchführen.
-
1 stellt
eine Musterobjektgestaltung für
ein Objekt der Shape-Klasse dar.
-
2A ist
ein Blockdiagramm, das herkömmliche
Verbindungen zwischen einem Serverobjekt und seinen Clientobjekten
darstellt.
-
2B stellt
ein typisches Erben einer Serverklasse (d. h. Server) durch eine
Ableitungs-Serverklasse (d. h. DServer) dar.
-
3 ist
ein Blockdiagramm, das Komponenten des Clientverfolgungssystems
bei einer Ausführung darstellt.
-
4 ist
ein Blockdiagramm, das Komponenten des Clientverfolgungssystems
einer Ausführung
ausführlicher
darstellt.
-
5 ist
ein Blockdiagramm, das eine Beispielobjektgestaltung der Clientverfolgungs-Serverklasse darstellt.
-
6 ist
ein Blockdiagramm, das eine Beispielobjektgestaltung für die Phantom-Managerklasse darstellt.
-
7 ist
ein Blockdiagramm, das die Objektgestaltung der Phantom-Serverklasse
darstellt.
-
8 ist
ein Diagramm, das die Verarbeitung darstellt, um einen Zeiger auf
ein Phantom-Serverobjekt statt auf das Serverobjekt selbst zu einem
Client zurückzusenden.
-
9 ist
ein Diagramm, das die Verarbeitung zum Ausgeben eines Zeigers auf
ein Phantom-Serverobjekt darstellt.
-
10 ist
ein Diagramm, das das Weiterleiten eines Funktionsaufrufs von einer
Phantom-Serverfunktion zu einer Clientverfolgungs-Serverfunktion
darstellt.
-
11 ist
ein Flussdiagramm einer Beispielimplementierung der Abfrage-Interfacefunktion
der Clientverfolgungs-Serverklasse.
-
12 ist
ein Flussdiagramm einer Beispielimplementierung des Konstruktors
der Phantom-Managerklasse.
-
13 ist
ein Flussdiagramm einer Beispielimplementierung der Erzeugungsfunktion
der Phantom-Managerklasse.
-
14 ist
ein Flussdiagramm einer Beispielimplementierung der Instanz-Erzeugungsfunktion
der Phantom-Managerklasse.
-
15 ist
ein Flussdiagramm einer Beispielimplementierung der Phantom-Going-away-Funktion der Phantom-Managerklasse.
-
16 ist
ein Flussdiagramm einer Beispielimplementierung des Konstruktors
der Phantom-Serverklasse.
-
17 ist
ein Flussdiagramm einer Beispielimplementierung des Destruktors
der Phantom-Serverklasse.
-
18 ist
ein Flussdiagramm einer Beispielimplementierung der Abfrage-Interfacefunktion
der Phantom-Serverklasse.
-
19 ist
ein Flussdiagramm einer Beispielimplementierung der Referenzhinzufügungsfunktion
der Phantom-Serverklasse.
-
20 ist
ein Flussdiagramm einer Beispielimplementierung der Ausgabefunktion
der Phantom-Serverklasse.
-
21 ist
ein Flussdiagramm einer Beispielimplementierung einer Funktion der
Phantom-Serverklasse, die von dem Interface der Serverklasse geerbt
wird.
-
Ein
Verfahren und System zum Verfolgen von Zugriff auf ein Serverobjekt
durch Clients wird bereitgestellt. Das Clientverfolgungssystem ermöglicht,
dass der Zugriff auf ein Serverobjekt für jeden einzelnen Client verfolgt
werden kann, wobei dies bei einer Ausführung ohne Modifizierung der
Serverklassendefinition erfolgt. Das Clientverfolgungssystem stellt
eine Clientverfolgungs-Serverklasse bereit, die eine Ableitung der
Serverklasse ist. Die Clientverfolgungs-Serverklasse enthält eine
Implementierung einer Abfrage-Interfacefunktion, die der Abfrage-Interfacefunktion
der Serverklasse übergeordnet
ist.
-
Wenn
die Abfrage-Interfacefunktion der Clientverfolgungs-Serverklasse
aufgerufen wird, instanziiert sie ein Phantom-Serverobjekt, das
eine Implementierung desselben Interfaces, wie es von der Serverklasse bereitgestellt
wird, bereitstellt (d. h. „IServer"). Die Abfrage-Interfacefunktion
sendet einen Zeiger auf das Phantom-Serverobjekt zurück.
-
Wenn
der Client eine Funktion des Phantom-Serverobjekts aufruft, kann
diese Funktion spezifische Verarbeitung durchführen und den Aufruf zu der
entsprechenden Funktion des Clientverfolgungs-Serverobjekts weiterleiten.
Die spezifische Verarbeitung kann zum Beispiel ein Verfolgen, welcher
Client eine bestimmte Funktion aufruft, und dann Durchführen eines
anderen Verhaltens, wenn derselbe Client eine andere Funktion aufruft,
einschließen.
Die spezifische Verarbeitung kann jedoch eine Verarbeitung einschließen, die
abhängt von
dem Feststellen, ob ein bestimmter Client eine bestimmte Funktion
der Serverklasse aufruft.
-
Bei
einer Ausführung
stellt das Clientverfolgungssystem eine Phantom-Serverklasse bereit,
die Funktionen enthält,
die den Funktionen der Serverklasse entsprechen und dieselbe Signatur
wie diese aufweisen. Das Clientverfolgungssystem stellt außerdem eine
Phantom-Managerklasse zum Instanziieren von Phantom-Serverobjekten,
zum Verfolgen der Phantom-Serverobjekte und zum Zurücksenden
von Zeigern auf die Phantom-Serverobjekte
bereit. Die Phantom-Managerklasse kann eine Erzeugungsfunktion aufweisen,
die, wenn sie von dem Clientverfolgungs-Serverobjekt aufgerufen
wird, ein Phantom-Serverobjekt instanziiert. Die Phantom-Managerklasse
kann außerdem
ein Instanz-Going-away-Funktion aufweisen, die aufgerufen wird, wenn
ein Phantom-Serverobjekt
zerstört
wird, so dass spezifische Verarbeitung durchgeführt werden kann, wenn ein Client
eine Referenz auf ein Phantom-Serverobjekt ausgibt, die verursacht,
dass die Referenzzählung
auf 0 geht. Die Phantom-Managerklasse kann außerdem eine Instanz-Erzeugungsfunktion
aufweisen, die spezifisch eingerichtet ist, um eine Instanz eines
bestimmten Clientverfolgungs-Serverobjekts zu erzeugen. Wenn die
Abfrage-Interfacefunktion
des Clientverfolgungs-Serverobjekts aufgerufen wird, ruft sie die
Erzeugungsfunktion des Phantom-Managerobjekts auf, die wiederum
die Instanz-Erzeugungsfunktion
aufruft. Die Instanz-Erzeugungsfunktion des Phantom-Managerobjekts
ist so zugeschnitten, dass sie eine Instanz des Phantom-Serverobjekts
für das
spezifische Clientverfolgungs-Serverobjekt erzeugt. Die Abfrage-Interfacefunktion
sendet einen Zeiger auf dieses Phantom-Serverobjekt zurück. Wenn
der Zeiger auf das Phantom-Serverobjekt ausgegeben wird und die
Referenzzählung
auf 0 geht, ruft der Destruktor des Phantom-Serverobjekts die Going-away-Funktion
des Phantom-Managerobjekts
auf. Die Phantom-Going-away-Funktion führt eine spezifische Verarbeitung
durch, die bei Zerstörung
eines Phantom-Serverobjekts benötigt
wird.
-
3 ist
ein Blockdiagramm, das Komponenten des Clientverfolgungssystems
bei einer Ausführung darstellt.
Die Komponenten schließen
ein Clientverfolgungs-Serverobjekt 301 und Phantom-Serverobjekte 302 bis 304,
auf die durch die Clientobjekte 305 bis 307 zugegriffen
wird, ein. Die Clientverfolgungs-Serverklasse erbt die Serverklasse
und stellt die Clientverfolgungsfunktionalität bereit. Das Clientverfolgungs-Serverobjekt stellt
sein Interface über
die Phantom-Serverobjekte für
Clientobjekte bereit. Das heißt,
dass jedes Clientobjekt, wenn es ein Interface von dem Clientverfolgungs-Serverobjekt
anfordert, mit einem Zeiger auf ein Interface eines Phantom-Serverobjekts
statt auf das Interface des Clientverfolgungs-Serverobjekts versehen
wird. Wann immer ein Clientobjekt die Abfrage-Interfacefunktion
des Clientverfolgungs-Serverobjekts oder eine Abfrage-Interfacefunktion
eines Phantom-Serverobjekts aufruft, sendet die Funktion einen Zeiger
auf ein Phantom-Serverobjekt zurück.
Ein Phantom-Serverobjekt erbt ein IServer-Interface effektiv so,
dass es Funktionen mit derselben Signatur und mit derselben Reihenfolge
der Serverklasse enthält.
Im Allgemeinen leiten die Funktionen der Phantom-Serverobjekte ihre
Aufrufe zu dem Clientverfolgungs-Serverobjekt weiter. Die Funktionen
eines Phantom-Serverobjekts können
spezifische Verarbeitung durchführen,
bevor oder nachdem sie die entsprechende Funktion des Clientverfolgungs-Serverobjekts
aufrufen. Auf diese Weise können
die Phantom-Serverfunktionen spezialisierte Verarbeitung für jedes
Clientobjekt durchführen.
Wenn ein Clientobjekt einen Zeiger dupliziert, dann würde das
Clientverfolgungssystem in Betracht ziehen, dass beide Zeiger zu
demselben Clientobjekt gehören,
auch wenn das Clientobjekt den duplizierten Zeiger zu einem anderen
Objekt sendet. Das Clientverfolgungssystem kann auf einem herkömmlichen
Computersystem, das eine Zentraleinheit, einen Speicher und Ein-/Ausgabe-Vorrichtungen enthält, implementiert
werden. Zusätzlich
können
die Clientobjekte und das Serverobjekt in demselben Prozess oder
in unterschiedlichen Prozessen, die auf unterschiedlichen Computersystem
ausführen
können,
instanziiert werden. Die Komponenten des Clientverfolgungssystems
können
auf einem computerlesbaren Medium, wie Speicher, Platte oder CD-ROM,
gespeichert werden, und können über ein
computerlesbares Datenübertragungsmedium übertragen
werden. Da auf diese Datenstrukturen durch mehrere Ausführungs-Threads
gleichzeitig zugegriffen werden kann, wird eine Gleichzeitigkeitsverwaltungstechnik
beim Zugriff auf diese Datenstrukturen verwendet. Wenn zum Beispiel
auf die Datenstrukturen zugegriffen wird, kann ein Thread die Datenstruktur
sperren und sie entsperren, wenn der Zugriff abgeschlossen ist.
Im Folgen den werden bei der Beschreibung der Funktionen, die auf
diese Datenstrukturen zugreifen, diese wohlbekannten Gleichzeitigkeitsverwaltungstechniken
weggelassen.
-
4 ist
ein Blockdiagramm, das Komponenten des Clientverfolgungssystems
einer Ausführung
ausführlicher
darstellt. Die Komponenten enthalten ein Clientverfolgungs-Serverobjekt 401,
ein Phantom-Managerobjekt 402 und Phantom-Serverobjekte 403.
Die Serverklasse, bei denen der Zugriff durch Clientobjekte zu verfolgen
ist, ist eine Basisklasse der Clientverfolgungs-Serverklasse. Die
Clientverfolgungs-Serverklasse führt
ein Datenelement ein, das ein Phantom-Managerobjekt ist. Zusätzlich ist
die Clientverfolgungs-Serverklasse der Abfrage-Interfacefunktion
der Serverklasse übergeordnet.
Die Phantom-Managerklasse kann eine Basisimplementierung ihrer Funktionen
aufweisen und kann eine übergeordnete
Implementierung einer Instanz-Erzeugungsfunktion und einer Instanz-Going-away-Funktion
bereitstellen. Die Instanz-Erzeugungsfunktion erzeugt das Phantom-Serverobjekt,
das das Interface der Serverklasse erbt. Die Instanz-Going-away-Funktion
wird aufgerufen, um spezifische Verarbeitung durchzuführen, wenn
ein Clientobjekt alle seiner Zeiger auf das Phantom-Serverobjekt
ausgegeben hat. Das Phantom-Managerobjekt ist dafür verantwortlich,
die Phantom-Serverobjekte zu erzeugen, wenn es von dem Clientverfolgungs-Serverobjekt
durch einen Aufruf einer Erzeugungsfunktion des Phantom-Managerobjekts
benachrichtigt wird. Das Clientverfolgungs-Serverobjekt würde während des
Aufrufs der Abfrage-Interfacefunktion des Clientverfolgungs-Serverobjekts
typischerweise die Erzeugungsfunktion aufrufen. Wenn ein Phantom-Serverobjekt
erfasst, dass seine Referenzzählung
auf 0 gegangen ist, ruft sie eine Going-away-Funktion des Phantom-Managerobjekts
auf. Diese Going-away-Funktion
ruft dann die Instanz-Going-away-Funktion auf, um spezifische Verarbeitung durchzuführen. Auf
diese Weise kann das Clientverfolgungssystem Verarbeitung durch
die Abfrage-Interfacefunktion, wenn ein Clientobjekt einen Zeiger
erhält,
und durch das Aufrufen der Instanz-Going-away-Funktion, wenn ein
Clientobjekt einen Zeiger ausgibt und die Referenzzählung auf
0 geht, durchführen.
-
5 ist
ein Blockdiagramm, das eine Beispielobjektgestaltung der Clientverfolgungs-Serverklasse darstellt.
Bei diesem Beispiel enthält
das Clientverfolgungs-Serverobjekt das Phantom-Managerobjekt als
ein Datenelement. Ein Entwickler, der Zugriffe auf das Serverobjekt
für jeden
einzelnen Client verfolgen will, würde eine Ableitung der Serverklasse
bereitstellen, die ein Phantom-Managerobjekt enthält und eine
Implementierung der Abfrage-Interfacefunktion, die der Abfrage-Interfacefunktion
der Serverklasse übergeordnet
ist, bereitstellt. Wenn alternativ die Abfrage-Interfacefunktion
per Konvention eine andere Funktion aufruft, dann kann diese andere
Funktion untergeordnet werden. Die Implementierung der Abfrage-Interfacefunktion
ruft die Erzeugungsfunktion des Phantom-Managerobjekts auf und sendet,
als den Zeiger auf das angeforderte Interface, den von der Erzeugungsfunktion
zurückgesendeten
Zeiger zurück.
Der Entwickler würde
eine übergeordnete
Implementierung der Instanz-Erzeugungsfunktion bereitstellen, die
spezifisch eingerichtet ist, um Phantom-Serverobjekte einer Klasse,
die dasselbe Interface erbt (d. h. IServer), als die Serverklasse
zu instanziieren. Wenn der Entwickler spezifische Verarbeitung bereitstellen
möchte,
wenn ein Clientobjekt seinen Zeiger ausgibt und die Referenzzählung auf
0 geht, dann kann der Entwickler eine übergeordnete Implementierung
der Instanz-Going-away-Funktion der Phantom-Managerklasse bereitstellen.
Der Entwickler könnte
außerdem
zusätzliche
Datenelemente und Funktionen in die Clientverfolgungs-Serverklasse
einführen,
um die spezifische Verarbeitung zu unterstützen.
-
6 ist
ein Blockdiagramm, das eine Beispielobjektgestaltung für die Phantom-Managerklasse
darstellt. Die Phantom-Managerklasse kann eine Basis-Phantom-Managerklasse
erben, die die Datenelemente und Funktionen von Tabelle 1 enthält.
-
-
-
7 ist
ein Blockdiagramm, das die Objektgestaltung der Phantom-Serverklasse
darstellt. Das Phantom-Serverobjekt erbt das Server-Interface der
Serverklasse (z. B. IServer). Das Phantom-Serverobjekt stellt eine
Implementierung jeder Funktion des Server-Interfaces bereit. Die Implementierungen
können
ihren Aufruf vor oder nach der Durchführung spezifischer Verarbeitung
für jeden
einzelnen Client zu der entsprechenden Funktion des Clientverfolgungs-Serverobjekts
weiterleiten. Tabelle 2 beschreibt Datenelemente der Phantom-Serverklasse.
-
-
8 ist
ein Diagramm, das die Verarbeitung darstellt, um einen Zeiger auf
ein Phantom-Serverobjekt statt auf das Serverobjekt selbst zu einem
Clientobjekt zurückzusenden.
Die Schritte 800 bis 803 stellen die Verarbeitung
der Abfrage-Interfacefunktion der Clientverfolgungs-Serverklasse
dar. Die Schritte 805 bis 808 stellen die Verarbeitung
der Erzeugungsfunktion der Phantom-Managerklasse dar. Die Schritte 810 bis 812 stellen
die Verarbeitung der Instanz-Erzeugungsfunktion der Phantom-Managerklasse
dar. Die Schritte 815 bis 817 stellen die Verarbeitung
des Konstruktors der Phantom-Serverklasse
dar. Wenn die Abfrage-Interfacefunktion eines Clientverfolgungs-Serverob jekts
aufgerufen wird, ruft die Funktion die Erzeugungsfunktion des Phantom-Managerobjekts
auf, wie durch den Pfeil von Schritt 801 zu Schritt 805 gezeigt.
Die Erzeugungsfunktion des Phantom-Managerobjekts ruft die Instanz-Erzeugungsfunktion
desselben Phantom-Managerobjekts auf, wie durch den Pfeil von Schritt 806 zu
Schritt 810 gezeigt. Die Instanz-Erzeugungsfunktion instanziiert
in Schritt 811 ein Phantom-Serverobjekt, das den Konstruktor
für das
Phantom-Serverobjekt aufruft, wie durch den Pfeil von Schritt 811 zu
Schritt 815 gezeigt. Der Konstruktor initialisiert in Schritt 816 das
Phantom-Serverobjekt, wie dies der gewünschten spezifischen Verarbeitung
entspricht, und kehrt dann zu der Instanz-Erzeugungsfunktion zurück, wie
durch den Pfeil von Schritt 817 zu Schritt 812 gezeigt.
Die Instanz-Erzeugungsfunktion kehrt dann zu der Erzeugungsfunktion
zurück,
wie durch den Pfeil von Schritt 812 zu Schritt 807 gezeigt. Die
Erzeugungsfunktion verknüpft
das instanziierte Phantom-Serverobjekt mit dem Phantom-Managerobjekt und
kehrt dann zu der Abfrage-Interfacefunktion des Clientverfolgungs-Serverobjekts
zurück,
wie durch den Pfeil von Schritt 808 zu Schritt 802 gezeigt.
In Schritt 802 ruft die Abfrage-Interfacefunktion die Referenzhinzufügungsfunktion
auf und kehrt dann mit dem Zeiger auf das Phantom-Serverobjekt zurück.
-
9 ist
ein Diagramm, das die Verarbeitung zum Ausgeben eines Zeigers auf
ein Phantom-Serverobjekt darstellt. Die Schritte 900 bis 903 stellen
die Verarbeitung der Ausgabefunktion des Phantom-Serverobjekts dar.
Die Schritte 905 bis 907 stellen die Verarbeitung
des Destruktors des Phantom-Serverobjekts dar. Die Schritte 910 bis 913 stellen
die Verarbeitung der Phantom-Going-away-Funktion des Phantom-Managerobjekts
dar. Die Schritte 915 bis 917 stellen die Verarbeitung
der Instanz-Going-away-Funktion
des Phantom-Managerobjekts dar. Wenn die Ausgabefunktion des Phantom-Serverobjekts aufgerufen
wird und die Referenzzählung
auf 0 geht, ruft die Funktion den Destruktor des Phantom-Serverobjekts
auf, wie durch den Pfeil von Schritt 901 zu Schritt 905 gezeigt.
Der Destruktor des Phantom-Serverobjekts ruft die Phantom-Goingaway-Funktion
des Phantom-Managerobjekts auf, wie durch den Pfeil von Schritt 906 zu
Schritt 910 gezeigt. Die Phantom-Going-away-Funktion trennt
in Schritt 911 das Phantom-Serverobjekt von einer verknüpften Liste von
Phantom-Serverobjekten und ruft in Schritt 912 die Instanz-Going-away-Funktion
auf, wie durch den Pfeil von Schritt 912 zu Schritt 915 gezeigt.
Die Instanz-Going-away-Funktion führt in Schritt 916 die
spezifische Verarbeitung des Clientverfolgungssystems durch. Die
Funktion kehrt dann zu der Phantom-Going-away-Funktion zurück, wie
durch den Pfeil von Schritt 917 zu Schritt 913 gezeigt.
Die Phantom-Going-away-Funktion kehrt dann zu dem Destruktor zurück, wie
durch den Pfeil von Schritt 913 zu Schritt 907 gezeigt.
Der Destruktor kehrt dann zu der Ausgabefunktion des Phantom-Serverobjekts
zurück,
wie durch den Pfeil von Schritt 907 zu Schritt 902 gezeigt.
In Schritt 902 schließt
die Ausgabefunktion die Zerstörung
ab, wobei dies Aufrufen der Ausgabefunktion des Clientverfolgungs-Serverobjekts
einschließen
kann. Die Ausgabefunktion kehrt dann zurück.
-
10 ist
ein Diagramm, das das Weiterleiten eines Funktionsaufrufs von einer
Phantom-Serverfunktion zu einer Clientverfolgungs-Serverfunktion
darstellt. Ein solches Weiterleiten wäre für jede Funktion der Serverklasse.
Die Schritte 1000 bis 1004 stellen die Verarbeitung
einer Funktion eines Phantom-Serverobjekts dar. Die Schritte 1005 bis
1007 stellen die Verarbeitung der Funktion dieses Serverobjekts
dar. Wenn die Funktion des Phantom-Serverobjekts aufgerufen wird,
kann die Funktion spezifische Vorverarbeitung in Schritt 1001 durchführen. Die
Funktion leitet dann den Aufruf zu der Funktion des Clientverfolgungs-Serverobjekts weiter,
wie durch den Pfeil von Schritt 1002 zu Schritt 1005 angezeigt.
Die Funktion des Clientverfolgungs-Serverobjekts führt ihre
Verarbeitung in Schritt 1006 durch und kehrt dann zurück, wie
durch den Pfeil von Schritt 1007 zu Schritt 1003 gezeigt.
In Schritt 1003 führt
die Funktion eine spezifische Nachverarbeitung durch und kehrt dann
zurück.
-
Die 11 bis 21 sind
Flussdiagramme von Beispielimplementierungen von Funktionen der
Clientverfolgungs-Serverklasse, der Phantom-Managerklasse und der
Phantom-Serverklasse. 11 ist ein Flussdiagramm der
Abfrage-Interfacefunktion der Clientverfolgungs-Serverklasse. Diese
Funktion entspricht der Abfrage-Interfacefunktion des IUknown-Interfaces.
Dieser Funktion wird die Kennung eines Interfaces zugeleitet und
sie sendet einen Zeiger auf das Interface zurück. Die Implementierung dieser
Funktion in der Clientverfolgungs-Serverklasse, die die Serverklasse
erbt, ist der Implementierung dieser Funktion in der Serverklasse übergeordnet.
In Schritt 1101 wird, wenn der weitergeleitete Interface-Identifier
für ein
zu verfolgendes Interface ist, die Funktion dann bei Schritt 1102 fortgesetzt,
andernfalls wird die Funktion bei Schritt 1103 fortgesetzt.
In Schritt 1102 ruft die Funktion die Erzeugungsfunktion
des Phantom-Managerobjekts auf, um ein Phantom-Serverobjekt zu erzeugen,
und sendet dann den Zeiger auf das Phantom-Serverobjekt zurück. In Schritt 1103 führt die
Funktion die normale Verarbeitung der Abfrage-Interfacefunktion
der Serverklasse durch und kehrt dann zurück.
-
Die 12 bis 15 sind
Flussdiagramme von Beispielimplementierungen von Funktionen der Phantom-Managerklasse. 12 ist
ein Flussdiagramm des Konstruktors der Phantom-Managerklasse. Ein Phantom-Managerobjekt
wird instanziiert, wenn die Instanz des Clientverfolgungs-Serverobjekts
instanziiert wird. Alternativ könnte
die Instanziierung verzögert
werden, bis ein zu verfolgendes Interface von einem Client angefordert
wird. Das Phantom-Managerobjekt kann als ein Datenelement des Clientverfolgungs-Serverobjekt instanziiert
werden oder kann dynamisch instanziiert werden. Dem Konstruktor
wird ein Zeiger auf das Clientverfolgungs-Serverobjekt zugeleitet.
In Schritt 1201 stellt der Konstruktor ein Datenelement
zum Zeigen auf das weitergeleitete Clientverfolgungs-Serverobjekt
ein. In Schritt 1202 initialisiert der Konstruktor eine
Zählung der
instanziierten Phantom-Serverobjekte und kehrt dann zurück.
-
13 ist
ein Flussdiagramm der Erzeugungsfunktion der Phantom-Managerklasse.
Diese Funktion instanziiert ein Phantom-Serverobjekt, verknüpft es mit
einer Liste zum Verfolgen und sendet einen Zeiger darauf zurück. In Schritt 1301 ruft
die Funktion die Instanz-Erzeugungsfunktion des Phantom-Managerobjekts
auf und empfängt
einen Zeiger auf das instanziierte Phantom-Serverobjekt. In Schritt 1302 fügt die Funktion
das Phantom-Serverobjekt zu einer Liste von Phantom-Serverobjekten
hinzu. In Schritt 1303 inkrementiert die Funktion die Zählung der
instanziierten Phantom-Serverobjekte und sendet dann einen Zeiger
auf das Phantom-Serverobjekt zurück.
-
14 ist
ein Flussdiagramm der Instanz-Erzeugungsfunktion der Phantom-Managerklasse.
Eine Implementierung dieser Funktion wird für jeden Typ von Phantom-Serverobjekt
bereitgestellt. Bei einer Ausführung
kann ein Clientverfolgungs-Serverobjekt mehrere Phantom-Manager
aufweisen, das heißt
einen für
jeden Typ von Interface, für
das ein Zeiger zurückgesendet
werden kann. Die Abfrage-Interfacefunktion des Clientverfolgungs-Serverobjekts
kann das geeignete Phantom-Managerobjekt auswählen. In Schritt 1401 instanziiert
die Funktion ein Phantom-Serverobjekt, indem ein Zeiger auf das
Clientverfolgungs-Serverobjekt und ein Zeiger auf das Phantom-Managerobjekt
weitergeleitet werden. Die Funktion sendet dann einen Zeiger auf
das instanziierte Phantom-Serverobjekt
zurück.
-
15 ist
ein Flussdiagramm der Phantom-Going-away-Funktion der Phantom-Managerklasse.
Diese Funktion wird aufgerufen, wenn ein Phantom-Serverobjekt zerstört wird.
Dies entfernt das Phantom-Serverobjekt aus der Liste und ruft die
Instanz-Goingaway-Funktion auf. Eine Implementierung der Instanz-Going-away-Funktion
wird durch den Entwickler der Clientverfolgungs-Serverklasse bereitgestellt,
um eine spezifische Verarbeitung durchzuführen, wenn ein Client einen
Zeiger auf das Phantom-Serverobjekt ausgibt und seine Referenzzählung auf
0 geht. In Schritt 1501 entfernt die Funktion das Phantom-Serverobjekt
aus der Liste. In Schritt 1502 dekrementiert die Funktion
die Zählung
von Phantom-Serverobjekten. In Schritt 1503 ruft die Funktion
die Instanz-Going-away-Funktion
auf und kehrt dann zurück.
-
Die 16 bis 21 sind
Flussdiagramme von Beispielimplementierungen von Funktionen der Phantom-Serverklasse. 16 ist
ein Flussdiagramm des Konstruktors der Phantom-Serverklasse. Diesem Konstruktor
werden ein Zeiger auf das Clientverfolgungs-Serverobjekt und ein
Zeiger auf das Phantom-Managerobjekt zugeleitet. In Schritt 1601 stellt
der Konstruktor ein Datenelement ein, um auf das Clientverfolgungs-Serverobjekt zu zeigen.
In Schritt 1602 stellt der Konstruktor ein Datenelement
ein, um auf das Phantom-Managerobjekt zu zeigen. Dann kehrt die
Funktion zurück.
-
17 ist
ein Flussdiagramm des Destruktors der Phantom-Serverklasse. In Schritt 1701 ruft
der Destruktor die Phantom-Going-away-Funktion des Phantom-Managerobjekts
auf, wobei ein Zeiger auf das Phantom-Serverobjekt weitergeleitet
wird. Der Destruktor kehrt dann zurück.
-
18 ist
ein Flussdiagramm der Abfrage-Interfacefunktion der Phantom-Serverklasse.
In Schritt 1801 leitet die Abfrage-Interfacefunktion ihren
Aufruf zu der Abfrage-Interfacefunktion
des Clientverfolgungs-Serverobjekts weiter. Die Funktion kehrt dann
zurück.
-
19 ist
ein Flussdiagramm der Referenzhinzufügungsfunktion der Phantom-Serverklasse.
In Schritt 1901 inkrementiert die Funktion die Referenzzählung des
Phantom-Serverobjekts.
In Schritt 1902 leitet die Funktion ihren Aufruf zu dem
Clientverfolgungs-Serverobjekt
weiter und kehrt dann zurück.
-
20 ist
ein Flussdiagramm der Ausgabefunktion der Phantom-Serverklasse.
In Schritt 2001 leitet die Funktion ihren Aufruf zu dem
Clientverfolgungs-Serverobjekt wei ter. In Schritt 2002 dekrementiert
die Funktion die Referenzzählung
des Phantom-Serverobjekts.
In Schritt 2003 setzt sich, wenn die Referenzzählung gleich
0 ist, die Funktion dann bei Schritt 2004 fort, andernfalls
kehrt die Funktion zurück.
In Schritt 2004 ruft die Funktion den Destruktor des Phantom-Serverobjekts
auf und kehrt dann zurück.
-
21 ist
ein Flussdiagramm einer Beispielimplementierung einer Funktion der
Phantom-Serverklasse, die von dem Interface der Serverklasse geerbt
wird. In Schritt 2101 führt
die Funktion spezifische Vorverarbeitung durch. In Schritt 2102 leitet
die Funktion den Aufruf zu der entsprechenden Funktion des Clientverfolgungs-Serverobjekts
weiter. In Schritt 2103 führt die Funktion spezifische
Nachverarbeitung durch. Die Funktion kehrt dann zurück.
-
Auf
Basis der obigen Beschreibung ist festzustellen, dass, auch wenn
spezifische Ausführungen
der Erfindung hierin zu Zwecken der Darstellung beschrieben wurden,
verschiedene Modifizierungen durchgeführt werden können. Zum
Beispiel umfasst der Begriff „Client" einen Typ von Softwarekomponente,
wie Modul, Prozess oder Thread, und ist nicht auf ein Objekt in
dem objektorientierten Sinn beschränkt. Zusätzlich könnte der Phantom-Manager kein
getrenntes Objekt sein. Vielmehr kann sein Verhalten in die Implementierung
der Abfragefunktion der Clientverfolgungs-Serverklasse integriert
werden. Die Integrierung kann geeignet sein, wenn nicht gewünscht wird,
spezifische Verarbeitung durchzuführen, wenn ein Phantom-Serverobjekt
erzeugt oder zerstört
wird. Außerdem
kann eine Serverklasse anfänglich
so definiert werden oder modifiziert werden, dass sie das Verhalten
der Phantom-Managerklasse so einschließt, dass Objekte verfolgt werden
können.
Außerdem
kann ein Phantom-Serverobjekt ein mit ihm assoziiertes Phantom-Phantom-Serverobjekt
aufweisen, um verschiedene Sub-Clients eines Client zu verfolgen.
Zum Beispiel könnte
eine Ableitung der Phantom-Serverklasse Clientverfolgung an dem
Phantom-Serverobjekt selbst implementieren. Die Prinzipien der vorliegenden Erfindung
können
in Umgebungen verwendet werden, in denen ein Server dynamisch umgewandelt
werden kann. COM von Microsoft ist eine solche Umgebung und die
Abfrage-Interfacefunktion des IUnknown-Interfaces stellt dynamisches
Umwandeln bereit. Folglich ist die Erfindung, außer durch die angehängten Ansprüche, nicht
beschränkt.