DE69424744T2 - Verfahren und System zur Verwaltung von Komponentenverbindungen - Google Patents
Verfahren und System zur Verwaltung von KomponentenverbindungenInfo
- Publication number
- DE69424744T2 DE69424744T2 DE69424744T DE69424744T DE69424744T2 DE 69424744 T2 DE69424744 T2 DE 69424744T2 DE 69424744 T DE69424744 T DE 69424744T DE 69424744 T DE69424744 T DE 69424744T DE 69424744 T2 DE69424744 T2 DE 69424744T2
- Authority
- DE
- Germany
- Prior art keywords
- component
- interface
- server
- connector
- client
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Lifetime
Links
- 238000000034 method Methods 0.000 title claims description 353
- 230000003111 delayed effect Effects 0.000 claims description 7
- 230000006870 function Effects 0.000 description 149
- 238000010586 diagram Methods 0.000 description 48
- 230000000007 visual effect Effects 0.000 description 12
- 230000002085 persistent effect Effects 0.000 description 8
- 230000002457 bidirectional effect Effects 0.000 description 7
- 150000001875 compounds Chemical class 0.000 description 5
- 230000008569 process Effects 0.000 description 5
- 239000011159 matrix material Substances 0.000 description 4
- 230000004044 response Effects 0.000 description 4
- 230000007246 mechanism Effects 0.000 description 3
- 230000004913 activation Effects 0.000 description 2
- 238000001994 activation Methods 0.000 description 2
- 230000006399 behavior Effects 0.000 description 2
- 102100026933 Myelin-associated neurite-outgrowth inhibitor Human genes 0.000 description 1
- 230000004931 aggregating effect Effects 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000009795 derivation Methods 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Communication Control (AREA)
Description
- Die vorliegende Erfindung betrifft ein Computersystem zum Verbinden von zwei Komponenten sowie ein dementsprechendes Verfahren.
- Computersysteme verwenden häufig objektorientierte Techniken. Ein Objekt wird durch Instanzdaten (Datenglieder) und Gliedfunktionen (Methoden), welche das Verhalten des Objekts implementieren, gebildet. Fig. 1A ist ein Blockdiagramm von typischen Datenstrukturen, die zum Wiedergeben eines Objekts verwendet werden. Die zum Wiedergeben eines Objekts verwendeten Datenstrukturen umfassen eine Instanzdatenstruktur 1A01, eine Virtuellfunktionstabelle 1A02 und die Funktionsglieder 1A03, 1A04, 1A05. Die Instanzdatenstruktur 1A01 enthält einen Zeiger auf die Virtuellfunktionstabelle 1A02 und enthält Datenglieder. Die Virtuellfunktionstabelle 1A02 enthält einen Eintrag für jedes virtuelle Funktionsglied, das für das Objekt definiert ist. Jeder Eintrag enthält eine Referenz auf den Code, der das entsprechende Funktionsglied implementiert. Das Layout dieses Beispielobjekts stimmt mit dem Modell überein, das in der US-Patentanmeldung 071682,537 mit dem Titel "METHOD FOR IMPLEMENTING VIRTUAL FUNCTIONS AND VIRTUAL BASES IN A COMPILER FOR AN OBJECT ORIENTED PROGRAMMING LANGUAGE" vom 9. April 1991 definiert ist. Im folgenden wird ein Objekt in Übereinstimmung mit der Definition in der Programmiersprache C++ als eine Instanz einer Klasse beschrieben. Dem Fachmann sollte deutlich sein, daß Objekte auch unter Verwendung von anderen Programmiersprachen definiert werden können.
- In der C++-Sprache werden objektorientierte Techniken durch die Verwendung von Klassen unterstützt. Eine Klasse ist ein benutzerdefinierter Typ. Eine Klassendeklaration beschreibt die Datenglieder und die Funktionsglieder der Klasse. Zum Beispiel definiert die folgende Deklaration Datenglieder und ein Funktionsglied einer Klasse mit dem Namen CIRCLE (Kreis).
- Die Variablen x und y spezifizieren den Mittelpunkt eines Kreises und die Variable radius (Radius) spezifiziert den Radius des Kreises. Diese Variablen werden als Datenglieder der Klasse CIRCLE bezeichnet. Die Funktion draw (Zeichnen) ist eine benutzerdefinierte Funktion, die den Kreis mit dem spezifizierten Radius an der spezifizierten Position zeichnet. Die Funktion draw wird als ein Funktionsglied der Klasse CIRCLE bezeichnet. Die Datenglieder und Funktionsglieder einer Klasse sind zusammengebunden, weil die Funktion auf einer Instanz der Klasse operiert. Eine Instanz einer Klasse wird auch als ein Objekt der Klasse bezeichnet.
- In der Syntax von C++ deklariert die folgende Anweisung die Objekte a und b als dem Typ der Klasse CIRCLE zugehörig.
- CIRCLE a, b;
- Diese Deklaration veranlaßt die Zuweisung von Speicher für die Objekte a und b. Die folgenden Anweisungen weisen Daten zu den Datengliedern der Objekte a und b zu.
- a.x = 2;
- a.y = 2;
- a.radius = 1;
- b.x = 4;
- b.y = 5;
- b.radius = 2;
- Die folgenden Anweisungen werden verwendet, um die durch die Objekte a und b definierten Kreise zu zeichnen.
- a.draw();
- b.draw();
- Eine abgeleitete Klasse ist eine Klasse, welche die Eigenschaften - Datenglieder und Funktionsglieder - ihrer Basisklassen erbt. Zum Beispiel erbt die folgende abgeleitete Klasse CIRCLE_FILL die Eigenschaften der Basisklasse CIRCLE.
- Diese Deklaration spezifiziert, daß die Klasse CIRCLE_FILL zusätzlich zu den Daten- und Funktionsgliedern, die in der Deklaration der Klasse CIRCLE_FILL eingeführt werden, das heißt zusätzlich zu dem Datenglied pattern (Muster) und dem Funktionsglied fill (Füllen), alle Daten- und Funktionsglieder in der Klasse CIRCLE enthält. In diesem Beispiel enthält die Klasse CIRCLE_FILL die Datenglieder x, y, radius und pattern und die Funktionsglieder draw und fill. Dabei wird gesagt, daß die Klasse CIRCLE_FILL die Eigenschaften der Klasse CIRCLE "erbt". Eine Klasse, welche die Eigenschaften einer anderen Klasse erbt, ist eine abgeleitete Klasse (z. B. CIRCLE_FILL). Eine Klasse, welche keine Eigenschaften einer anderen Klasse erbt, ist eine Primärklasse (oder Wurzelklasse) (z. B. CIRCLE). Eine Klasse, deren Eigenschaften durch eine andere Klasse geerbt werden ist eine Basisklasse (z. B. ist CIRCLE eine Basisklasse von CIRCLE_FILL). Eine abgeleitete Klasse kann die Eigenschaften von mehreren Klassen erben, das heißt, eine abgeleitete Klasse kann mehrere Basisklassen haben. Dies wird als mehrfache Vererbung bezeichnet.
- Eine abgeleitete Klasse kann spezifizieren, daß eine Basisklasse virtuell geerbt wird. Die virtuelle Vererbung einer Basisklasse bedeutet, daß nur eine Instanz der virtuellen Basisklasse in der abgeleiteten Klasse existiert. Das folgende Beispiel ist eine abgeleitete Klasse mit zwei nicht-virtuellen Basisklassen.
- class CIRCLE_1 : CIRCLE {...};
- class CIRCLE_2 : CIRCLE {...};
- class PATTERN : CIRCLE_1, CIRCLE2 {...};
- In dieser Deklaration erbt die Klasse PATTERN die Klasse CIRCLE zweimal nicht-virtuell durch die Klassen CIRCLE_1 und CIRCLE_2. Es sind zwei Instanzen der Klasse CIRCLE in der Klasse PATTERN.
- Das folgende ist ein Beispiel einer abgeleiteten Klasse mit zwei virtuellen Basisklassen.
- class CIRCLE_2 : virtual CIRCLE {...};
- class CIRCLE_2 : virtual CIRCLE {...};
- class PATTERN : CIRCLE_1, CIRCLE_2 {...};
- Die abgeleitete Klasse PATTERN erbt die Klasse CIRCLE zweimal durch die Klassen CIRCLE_1 und CIRCLE_2. Weil die Klasse CIRCLE zweimal virtuell geerbt wird, ist nur ein Objekt der Klasse CIRCLE in der abgeleiteten Klasse PATTERN. Dem Fachmann sollte deutlich sein, daß die virtuelle Vererbung sehr nützlich sein kann, wenn die Klassenableitung komplexer ist.
- Eine Klasse kann spezifizieren, ob seine Funktionsglieder virtuell sind. Die Deklaration, daß ein Funktionsglied virtuell ist, bedeutet, daß die Funktion durch eine Funktion mit demselben Namen und Typ in einer abgeleiteten Klasse überschrieben werden kann. In dem folgenden Beispiel wird die Funktion draw als virtuell in den Klassen CIRCLE und CIRCLE_FILL deklariert.
- Die C++-Sprache sieht einen Zeigerdatentyp vor. Ein Zeiger speichert Werte, die Adressen von Objekten im Speicher sind. Über einen Zeiger kann auf ein Objekt zugegriffen werden. Die folgende Anweisung deklariert die Variable c_ptr als einen Zeiger auf ein Objekt der Typenklasse CIRCLE und setzt die Variable c_ptr zum Speichern der Adresse des Objekts c.
- CIRCLE*c_ptr;
- c_ptr = &c;
- Um mit diesem Beispiel fortzufahren, deklariert die folgende Anweisung das Objekt a als der Typenklasse CIRCLE zugehörig und das Objekt b als der Typenklasse CIRCLE_FULL zugehörig.
- CIRCLE a;
- CIRCLE_FILL b;
- Die folgende Anweisung verweist auf die Funktion draw, die in der Klasse CIRCLE definiert ist.
- a.draw();
- Die folgende Anweisung verweist dagegen auf die Funktion draw, die in der Klasse CIRCLE_FILL definiert ist.
- b.draw();
- Weiterhin machen die folgenden Anweisungen das Objekt b zu einem Objekt der Typenklasse CIRCLE und rufen die Funktion draw auf, die in der Klasse CIRCLE_FILL definiert ist.
- CIRCLE*c_ptr;
- c_ptr = &b;
- c_ptr-> draw(); // CIRCLE_FILL::draw()
- Die aufgerufene virtuelle Funktion ist also die Funktion CIRCLE_FILL::draw.
- Ein Vorteil bei der Verwendung von objektorientierten Techniken ist, daß diese Techniken verwendet werden können, um die gemeinsame Verwendung von Objektstrukturen zu vereinfachen. Zum Beispiel vereinfachen objektorientierte Techniken das Erstellen von zusammengesetzten Dokumenten. Ein zusammengesetztes Dokument ist ein Dokument, das Objekte enthält, die durch verschiedene Computerprogramme erzeugt werden. (Typischerweise werden nur die Datenglieder des Objekts und der Klassentyp in einem zusammengesetzten Dokument gespeichert.) Ein Textverarbeitungsdokument, das ein durch ein Tabellenkalkulationsprogramm erzeugtes Tabellenkalkulationsobjekt enthält, ist ein zusammengesetztes Dokument. Ein Textverarbeitungsprogramm erlaubt es einem Benutzer, ein Tabellenkalkulationsobjekt (z. B. eine Zelle) innerhalb des Textverarbeitungsdokuments einzubetten. Bei einer Möglichkeit für ein derartiges Einbetten wird das Textverarbeitungsprogramm typischerweise unter Verwendung der Klassendefinition des einzubettenden Objekts kompiliert, um auf Funktionsglieder des eingebetteten Objekts zuzugreifen. Das Textverarbeitungsprogramm muß also unter Verwendung der Klassendefinition aller Klassen von Objekten kompiliert werden, die in einem Textverarbeitungsdokument eingebettet werden können. Um ein Objekt einer neuen Klasse in einem Textverarbeitungsdokument einzubetten, muß das Textverarbeitungsprogramm mit der neuen Klassendefinition neu kompiliert werden. Es können also nur Objekte der Klassen eingebettet werden, die durch den Entwickler des Textverarbeitungsprogramms ausgewählt wurden. Bei Verwendung dieser Technik können neue Klassen nur durch eine neuen Version des Textverarbeitungsprogramms unterstützt werden.
- Um das Einbetten von Objekten einer beliebigen Klasse in zusammengesetzten Dokumenten zu ermöglichen, sind Schnittstellen definiert, über welche auf ein Objekt zugegriffen werden kann, ohne daß dazu erforderlich ist, daß das Textverarbeitungsprogramm während des Kompilierens auf die Klassenimplementierung Zugriff hat. Eine abstrakte Klasse ist eine Klasse, in der ein virtuelles Funktionsglied keine Implementierung hat (rein ist). Eine Schnittstelle ist eine abstrakte Klasse, die keine Datenglieder umfaßt und deren virtuelle Funktionen alle rein sind.
- Die folgende C++-Klassendefinition ist eine beispielhafte Definition für eine Schnittstelle. In diesem Beispiel erlaubt ein Textverarbeitungsprogramm der einfacheren Darstellung halber nur das Einbetten von Tabellenkalkulationsobjekten und nicht von beliebigen Klassen von Objekten. Ein Objekt, das eine Schnittstelle vorsieht, ist ein Serverobjekt, und ein Objekt, das eine Schnittstelle verwendet, ist ein Clientobjekt. Ein Tabellenkalkulationsobjekt, das diese Schnittstelle vorsieht, kann unabhängig davon, wie das Objekt implementiert wird, eingebettet werden. Weiterhin kann ein beliebiges Tabellenkalkulationsobjekt unabhängig davon eingebettet werden, ob es vor oder nach der Kompilierung des Textverarbeitungsprogramms implementiert wird.
- Der Entwickler eines Tabellenkalkulationsprogramms muß eine Implementierung der Schnittstelle vorsehen, um das Einbetten von Tabellenkalkulationsobjekten in einem Textverarbeitungsdokument zu erlauben. Wenn das Textverarbeitungsprogramm ein Tabellenkalkulationsobjekt einbettet, muß das Programm auf den Code zugreifen, der die Schnittstelle für das Tabellenkalkulationsobjekt implementiert. Um auf den Code zuzugreifen, wird jeder Implementierung ein eindeutiger Klassenbezeichner zugeordnet. Zum Beispiel kann ein durch die Microsoft Corporation entwickeltes Tabellenkalkulationsobjekt einen Klassenbezeichner "MSSpreadsheet" haben, während ein durch eine andere Firma entwickeltes Tabellenkalkulationsobjekt einen Klassenbezeichner "LTSSSpreadsheet" haben kann. In jedem Computersystem wird eine konsistente Registrierung aufrechterhalten, welche jeden Klassenbezeichner auf den Code mapt, der diese Klasse implementiert. Wenn ein Tabellenkalkulationsprogramm auf einem Computersystem installiert wird, wird typischerweise die konsistente Registrierung aktualisiert, um die Verfügbarkeit dieser Klasse von Tabellenkalkulationsobjekten wiederzugeben. Solange der Entwickler der Tabellenkalkulation jedes durch die Schnittstelle definierte Funktionsglied implementiert und die konsistente Registrierung aufrechterhalten wird, kann das Textverarbeitungsprogramm die Tabellenkalkulationsobjekte des Entwicklers in einem Textverarbeitungsdokument einbetten.
- Verschiedene Entwickler von Tabellenkalkulationen können jedoch wünschen, daß nur bestimmte Funktionsglieder eingebettet werden. Zum Beispiel kann ein Entwickler einer Tabellenkalkulation wünschen, daß keine Datenbankunterstützung implementiert wird, aber alle anderen Funktionsglieder unterstützt werden. Damit der Entwickler der Tabellenkalkulation nur einige der Funktionsglieder unterstützen kann und die Objekte trotzdem eingebettet werden können, sind mehrere Schnittstellen für Tabellenkalkulationsobjekte definiert. Zum Beispiel können die Schnittstellen IData und IBasicSpreadsheet für ein Tabellenkalkulationsobjekt wie folgt definiert sein.
- Jeder Entwickler einer Tabellenkalkulation kann die Schnittstelle IBasicSpreadsheet und optional die Schnittstelle IData implementieren.
- In der Laufzeit muß das Textverarbeitungsprogramm (oder ein anderer Client der Schnittstelle) bestimmen, ob ein einzubettendes Tabellenkalkulationsprogramm die Schnittstelle IData unterstützt. Für diese Bestimmung ist eine andere Schnittstelle (die durch jedes Tabellenkalkulationsobjekt implementiert wird) mit einem Funktionsglied definiert, das angibt, welche Schnittstellen für das Objekt implementiert werden. Diese Schnittstelle hat den Namen IUnknown (und wird als Unknown-Schnittstelle oder Objektverwaltungsschnittstelle bezeichnet) und wird wie folgt definiert.
- Die IUnknown-Schnittstelle definiert das Funktionsglied (Methode) QueryInterface. Die Methode QueryInterface erhält einen Schnittstellenbezeichner (z. B. "IData") im Parameter üd (des Typs REFIID) und gibt einen Zeiger auf die Implementierung der identifizierten Schnittstelle für das Objekt aus, für das die Methode im Parameter ppv aufgerufen wird. Wenn das Objekt die Schnittstelle nicht unterstützt, dann gibt die Methode eine Fehlermeldung aus. (Der Typ HRESULT gibt einen vordefinierten Status an, und der Typ ULONG gibt eine lange Ganzzahl ohne Vorzeichen an.) CODETABELLE 1A
- Die Codetabelle 1A enthält einen C++-Pseudocode für eine typische Implementierung der Methode QueryInterface für die Klasse XX, welche die Klasse IUnknown erbt. Wenn das Tabellenkalkulationsobjekt die IData-Schnittstelle unterstützt, dann enthält die Methode Query- Interface das entsprechende Case-Etikett in der Switch-Anweisung. Die Variablen pIBasic- Spreadsheet und pIData zeigen jeweils auf einen Zeiger auf die Virtuellfunktionstabellen der Schnittstellen IBasicSpreadsheet und IData. Die Methode QueryInterface ruft die Methode AddRef (weiter unten beschrieben) auf, um eine Referenzzählung für das Objekt der Klasse XX zu inkrementieren, wenn ein Zeiger auf eine Schnittstelle ausgegeben wird. CODETABELLE 1B
- Die Schnittstelle IUnknown definiert auch die Methoden AddRef und Release, die zum Implementieren der Referenzzählung verwendet werden. Immer wenn eine neue Referenz auf eine Schnittstelle erstellt wird, wird die Methode AddRef aufgerufen, um eine Referenzzählung des Objekts zu inkrementieren. Immer wenn keine Referenz mehr erforderlich ist, wird die Methode Release aufgerufen, um die Referenzzählung des Objekts zu dekrementieren und um das Objekt freizugeben, wenn die Referenzzählung zu Null geht. Die Codetabelle 1B enthält einen C++-Pseudocode für eine typische Implementierung der Methoden AddRef und Release für die Klasse XX, welche die Klasse IUnknown erbt.
- Die Schnittstelle IData und die Schnittstelle IBasicSpreadsheet erben die Schnittstelle IUnknown. Die folgenden Definitionen stellen die Verwendung der Schnittstelle IUnknown dar.
- Fig. 1B ist ein Blockdiagramm, das eine beispielhafte Datenstruktur eines Tabellenkalkulationsobjekts darstellt. Das Tabellenkalkulationsobjekt umfaßt eine Objektdatenstruktur 1B01 eine IBasicSpreadsheet-Schnittstellendatenstruktur 1B03, eine IData-Schnittstellendatenstruktur 1B04, die Virtuellfunktionstabellen 1B02, 1B05, 1B06 und die Methoden 1B07 bis 1B21. Die Objektdatenstruktur 1B01 enthält einen Zeiger auf die Virtuellfunktionstabelle 1B02 und Zeiger auf die Schnittstellen IBasicSpreadsheet und IData. Jeder Eintrag in der Virtuellfunktionstabelle 1B02 enthält einen Zeiger auf eine Methode der Schnittstelle IUnknown. Die IBasic-Schnittstellendatenstruktur 1B03 enthält einen Zeiger auf die Virtuellfunktionstabelle 1B05. Jeder Eintrag in der Virtuellfunktionstabelle 1B05 enthält einen Zeiger auf eine Methode der Schnittstelle IBasicSpreadsheet. Die IData-Schnittstellendatenstruktur 1B04 enthält einen Zeiger auf die Virtuellfunktionstabelle 1B06. Jeder Eintrag in der Virtuellfunktionstabelle 1B06 enthält einen Zeiger auf eine Methode der Schnittstelle IData. Weil die Schnittstellen IBasicSpreadsheet und IData die Schnittstelle IUnknown erben, enthält jede Virtuellfunktionstabelle 1B05 und 1B06 einen Zeiger auf die Methoden QueryInterface, AddRef und Release. Im folgenden wird eine Objektdatenstruktur durch die Form 1B22 wie dergegeben, die mit den Schnittstellen etikettiert ist, über welche auf das Objekt zugegriffen werden kann.
- Der folgende Pseudocode stellt dar, wie ein Textverarbeitungsprogramm bestimmt, ob ein Tabellenkalkulationsobjekt die Schnittstelle IData unterstützt.
- Der Zeiger pIBasicSpreadsheet ist ein Zeiger auf die Schnittstelle IBasicSpreadsheet des Objekts. Wenn das Objekt die Schnittstelle IData unterstützt, setzt die Methode Query- Interface den Zeiger pIData so, daß er auf die IData-Datenstruktur zeigt, und gibt den Wert S_OK aus.
- Normalerweise kann ein Objekt (eine im Speicher erzeugte Instanz des Objekts) durch eine Variablendeklaration oder durch den Operator "Neu" erstellt werden. Beide Erstellungstechniken erfordern jedoch die Klassendefinition während der Kompilierung. Eine andere Technik ist erforderlich, damit ein Textverarbeitungsprogramm ein Tabellenkalkulationsobjekt in Laufzeit erstellen kann. Eine Technik sieht eine globale Funktion CreateInstanceXX vor, die wie folgt definiert ist.
- Die Methode CreateInstanceXX (auch als Klassenfabrik bezeichnet) erstellt ein Objekt der Klasse XX und gibt einen Zeiger ppv auf die durch den Parameter iid angegebene Schnittstelle des Objekts aus.
- IEEE MICRO, Oktober 1991, USA, Bd. 11, Nr. 5 ISSN 0272-1732 beschreibt auf den Seiten 16-19 eine Umgebung mit entfernten Prozeduraufrufen für fehlertolerante, heterogene und verteilte Systeme. Insbesondere beschreibt dieser Artikel eine Softwareumgebung zum Programmieren von verteilten Computersystemen. Programme, die auf verschiedenen Computern, die möglicherweise verschiedenen Typen angehören und unterschiedliche Betriebssysteme verwenden, laufen, kommunizieren in einer Client-Server-Beziehung über entfernte Prozeduraufrufe. Insbesondere schlägt dieser Artikel vor, erste und zweite Komponenten als Anwendungen, welche auf den Client- und Servereinheiten laufen, und weiterhin erste und zweite Verbindungen vorzusehen, die durch den Clientstub und den Serverstub implementiert werden. Insbesondere wird weiterhin vorgeschlagen, einen automatische Stuberzeugung mittels eines Stubgenerators vorzusehen. Der Stubgenerator analysiert die Datei, die das Servermodul definiert. Diese Serverdefinitionsdatei ist dem Client- und dem Servermodul gemeinsam. Der Stubgenerator erzeugt die Implementierungsmodule des Client- und des Serverstubs. Das Prinzip der Stuberzeugung ist in Fig. 7 des Artikels gezeigt.
- Es ist eine Aufgabe der vorliegenden Erfindung, ein Verfahren und ein System anzugeben, welche die Interaktion zwischen Komponenten derart verwalten, daß die Belastung minimiert wird.
- Diese Aufgabe wir durch den Gegenstand der unabhängigen Ansprüche 1 und 8 gelöst. Bevorzugte Ausführungsformen sind Gegenstand der abhängigen Ansprüche.
- Fig. 1A ist ein Blockdiagramm von typischen Datenstrukturen, die zum Wiedergeben eines Objekts verwendet werden.
- Fig. 1B ist ein Blockdiagramm, das eine beispielhafte Datenstruktur eines Tabellenkalkulationsobjekts darstellt.
- Fig. 1C ist ein Blockdiagramm, das eine unidirektionale Verbindung darstellt.
- Fig. 1D ist ein Blockdiagramm, das eine bidirektionale Verbindung darstellt.
- Fig. 1E ist ein Blockdiagramm, das mehrfache Verbindungen über ein Protokoll darstellt.
- Fig. 1F ist ein Blockdiagramm, das eine Komponente darstellt, die mehrere Protokolle unterstützt.
- Fig. 2A ist ein Blockdiagramm, das die Struktur einer bevorzugten Komponente darstellt.
- Fig. 2B ist ein Blockdiagramm, das eine bevorzugte Datenstruktur eines Komponentenmanagers darstellt.
- Fig. 3 ist ein Blockdiagramm, das ein Beispiel für eine Verbindung zwischen zwei Komponenten in einer bevorzugten Ausführungsform darstellt.
- Fig. 4 ist ein Flußdiagramm der Funktion ComponentInit.
- Fig. 5 ist ein Flußdiagramm der Funktion ComponentConnect.
- Fig. 6 ist ein Flußdiagramm der Funktion ComponentDisconnect.
- Fig. 7 ist ein Flußdiagramm der Methode Connect der Schnittstelle Ijack.
- Fig. 8 ist ein Flußdiagramm der Methode NotifyDidConnect der Schnittstelle IJack.
- Fig. 9 ist ein Flußdiagramm der Methode NotifyAndDisconnect der Schnittstelle IJack.
- Fig. 1 β ist ein Flußdiagramm der Methode Disconnect der Schnittstelle IJack.
- Fig. 11 ist ein Flußdiagramm der Methode ConnectAndNotify der Schnittstelle IPlug.
- Fig. 12 ist ein Flußdiagramm der Methode NotifyWillDisconnect der Schnittstelle IPlug.
- Fig. 13 ist ein Flußdiagramm der Methode Disconnect der Schnittstelle IPlug.
- Fig. 14 ist ein Flußdiagramm der Methode NewConnector der Schnittstelle IComponentJack.
- Fig. 15 ist ein Flußdiagramm der Methode Extrude der Schnittstelle IDescriptorEntry.
- Fig. 16 ist ein Blockdiagramm, das ein Lazy Binding darstellt.
- Fig. 17B ist ein Blockdiagramm, das eine bevorzugte Implementierung des Sammelsende-Schnittstellenstubs darstellt.
- Fig. 17A ist ein Flußdiagramm, das eine beispielhafte Methode eines Stubs zeigt.
- Fig. 18 ist ein Flußdiagramm der Methode Passivate der Schnittstelle IConnector.
- Fig. 19 ist ein Flußdiagramm der Methode BindStub der Schnittstelle IConnector.
- Fig. 20 ist ein Blockdiagramm, das eine Elternkomponente und eine Kindkomponente zeigt.
- Fig. 21A und 21B bilden ein Flußdiagramm der Funktion ComponentCreateChild.
- Fig. 22 ist ein Flußdiagramm der Funktion ComponentProjectDescriptor.
- Fig. 23 ist ein Flußdiagramm der Methode SetMoniker der Schnittstelle IComponent.
- Fig. 24 ist ein Flußdiagramm der Methode GetMoniker der Klasse ComponentManager.
- Fig. 25 ist ein Flußdiagramm der Methode SetParentMoniker der Klasse Component- Manager.
- Fig. 26 ist ein Flußdiagramm der privaten Methode Rename der Schnittstelle IComponent.
- Fig. 27 ist ein Flußdiagramm der Methode SetChildMoniker der Schnittstelle IComponent.
- Fig. 28 ist ein Flußdiagramm der Methode SetParentComponent der Schnittstelle IComponent.
- Fig. 29 ist ein Flußdiagramm der Methode DoEagerBinds der Schnittstelle IComponent.
- Fig. 30 ist ein Blockdiagramm, das ein beispielhaftes System darstellt, welches die vorliegende Erfindung verwendet.
- Fig. 31 ist ein Diagramm der Anzeige eines beispielhaften visuellen Programms.
- Fig. 32 ist ein Blockdiagramm der erstellten Komponenten.
- Die vorliegende Erfindung gibt ein Verfahren und ein System zum Verwalten von gemeinsamen Schnittstellen zwischen Komponenten an. In einer bevorzugten Ausführungsform sieht eine Benutzerkomponente eine Implementierung einer Schnittstelle und eine Beschreibung der Schnittstelle vor. Ein Komponentenmanager nimmt die Benutzerkomponente in sich selbst auf, um eine Serverkomponente zu bilden. Wenn eine Clientkomponente eine Verbindung mit der Schnittstelle anfordert, ruft der Komponentenmanager eine Referenz auf die Schnittstelle von der Benutzerkomponente auf und sendet die Referenz zu der Clientkomponente. In einer bevorzugten Ausführungsform verfolgt der Komponentenmanager die Clientkomponenten, die über eine Schnittstelle verbunden sind. Eine Benutzerkomponente kann auch mehrere Schnittstellen zu Clientkomponenten vorsehen, die ebenfalls vom Komponentenmanager verfolgt werden.
- Eine Komponente sieht Dienste für verschiedene andere Komponenten vor. Diese Dienste werden über eine Schnittstelle vorgesehen, die durch die Komponente implementiert wird. Eine Komponente, die eine Schnittstelle vorsieht, wird als Serverkomponente (Server) bezeichnet, und eine Komponente, welche diese Schnittstelle verwendet, ist eine Clientkomponente (Client). Eine Clientkomponente erhält einen Zeiger auf die Schnittstelle und fordert Dienste an, indem sie die Methoden der Schnittstelle aufruft. In bestimmten Fällen kann die Clientkomponente wünschen, direkt durch die Serverkomponente über ein bestimmtes Ereignis benachrichtigt zu werden, oder die Serverkomponente kann wünschen, Information von der Clientkomponente abzurufen. In diesen Fällen sieht die Clientkomponente eine Schnittstelle, die als Umkehrschnittstelle bezeichnet wird, für die Serverkomponente vor. Die Serverkomponente erhält einen Zeiger auf die Umkehrschnittstelle und fordert Dienste an, indem sie Methoden der Umkehrschnittstelle aufruft. Typischerweise sieht eine Serverkomponente eine spezifische Schnittstelle vor und fordert Dienste der Clientkomponente über eine spezifische Umkehrschnittstelle an. Die Kombination aus der spezifischen Schnittstelle und der Umkehrschnittstelle wird als ein Protokoll bezeichnet. Protokolle können entweder unidirektional oder bidirektional sein. Ein unidirektionales Protokoll ist ein Protokoll, in welchem die Clientkomponente keine Umkehrschnittstelle vorsieht. Dienste werden hier also nur durch die Serverkomponente vorgesehen. Ein bidirektionales Protokoll ist ein Protokoll, in welchem sowohl die Client- wie die Serverkomponente Schnittstellen vorsehen. Dienste werden hier von der Server- und von der Clientkomponente vorgesehen. Eine Verbindung wird über ein Protokoll zwischen einer Serverkomponente und einer Clientkomponente hergestellt, indem ein Zeiger auf die Schnittstelle von dem Server zu dem Client gegeben wird, und wenn das Protokoll bidirektional ist, dann wird ein Zeiger auf die Umkehrschnittstelle vom Client zum Server gegeben. (Eine ausführliche Beschreibung der Schnittstellen und Komponenten ist in "OLE 2.0 Design Specification" enthalten.)
- Fig. 1C ist ein Blockdiagramm, das eine unidirektionale Verbindung darstellt. Der Server 101 sieht die Schnittstelle IServer für den Client 102 vor. Der Client 102 enthält einen Zeiger auf die Schnittstelle IServer. Fig. 1D ist ein Blockdiagramm, das eine bidirektionale Verbindung darstellt. Der Server 111 sieht die Schnittstelle IServer vor, und der Client 112 sieht die Schnittstelle IClient vor. Der Server 111 enthält einen Zeiger auf die Schnittstelle IClient, und der Client 112 enthält einen Zeiger auf die Schnittstelle IServer. Der Server 111 und der Client 112 werden über das IServer/IClient-Protokoll verbunden.
- In dem Fall eines bidirektionalen Protokolls sehen sowohl die Serverkomponente wie die Clientkomponente Dienste füreinander vor. Jede der Komponenten kann also sowohl als Server wie als Client von Diensten betrachtet werden. Indem eine Komponente ein bestimmtes von ihr unterstütztes Protokoll spezifiziert, identifiziert die Komponente Dienste, die sie vorsieht, und Dienste, die sie von einer Clientkomponente anfordert. Im folgenden wird eine Schnittstelle eines Protokolls als "Buchsenschnittstelle" (Jack-Interface) bezeichnet, während die andere Schnittstelle als "Steckerschnittstelle" (Plug-Interface) bezeichnet wird. Die Komponente, welche die Buchsenschnittstelle vorsieht, sieht die "Buchsenverbindung" des Protokolls vor, und die Komponente, welche die Steckerschnittstelle vorsieht, sieht die "Steckerverbindung" des Protokolls vor.
- Eine Komponente kann das Herstellen von mehrfachen Verbindungen für ein Protokoll erlauben. Fig. 1E ist ein Blockdiagramm, das mehrfache Verbindungen über ein Protokoll darstellt. Der Server 121 sieht die Schnittstelle IServer vor, und die Clients 122 und 123 sehen jeweils eine Implementierung der Schnittstelle IClient vor. Der Server 121 enthält einen Zeiger auf jede Schnittstelle IClient, und jeder Client 122 und 123 enthält einen Zeiger auf die Schnittstelle IServer. Der Server 121 kann verschiedene Zeiger auf jeden Client vorsehen, damit der Server Zustandsinformation für jeden Client aufrechterhalten kann und den Client identifizieren kann, der einen Dienst anfordert.
- Eine Komponente kann auch mehrere Protokolle und das Herstellen von mehrfachen Verbindungen für jedes Protokoll unterstützen. Fig. 1F ist ein Blockdiagramm, das eine Komponente darstellt, die mehrere Protokolle unterstützt. Der Server 131 unterstützt das Protokoll IServerA/IClientA und das Protokoll IServerB/IClientB. Die Clients 132 und 133 werden über das Protokoll IServerA/IClientA verbunden, und die Clients 134 und 135 werden über das Protokoll IServerB/IClientB verbunden.
- Die vorliegende Erfindung gibt ein Verfahren und ein System zum Steuern der Herstellung von Verbindungen zwischen Komponenten an. In einer bevorzugten Ausführungsform ist eine Komponente, die eine Implementierung einer Schnittstelle eines Protokolls vorsieht, eine Benutzerkomponente. Eine Benutzerkomponente wird mit einem Komponentenmanagerobjekt verbunden, um ein Komponentenobjekt zu bilden. Das Komponentenmanagerobjekt (Komponentenmanger) verwaltet das Herstellen und Verfolgen der Verbindungen zu den Schnittstellen, die durch die Benutzerkomponente vorgesehen werden. Der Komponentenmanager sieht Schnittstellen vor, über welche Verbindungen in einer von der Domäne unabhängigen Weise hergestellt werden können.
- Fig. 2A ist ein Blockdiagramm, das die Struktur einer bevorzugten Komponente darstellt. Das Komponentenobjekt 201 umfaßt einen Komponentenmanager 202, eine Benutzerkomponente 203 und Verbinderobjekte 204 (Verbinder). Der Komponentenmanager 202 verwaltet die Verbindung der Komponente 201 mit anderen Komponenten über Protokolle, die durch die Benutzerkomponente 203 vorgesehen werden. Der Komponentenmanager sieht eine Schnittstelle IComponentManager zum Steuern der Verbindung von Komponenten vor. Die Benutzerkomponente 103 sieht ein domänenspezifisches Verhalten der Schnittstellen vor. Die Verbinder 104 werden durch den Komponentenmanager erstellt, verfolgen den Status der Verbindungen und sehen eine Schnittstelle IConnector zum Steuern der Verbindungen vor.
- Fig. 2B ist ein Blockdiagramm, das eine bevorzugte Datenstruktur eines Komponentenmanagers darstellt. Eine Komponente 211 umfaßt einen Komponentenmanager 212 und eine Verknüpfungsliste mit Verbinderbeschreibereinträgen 213 (DE-Liste). Jeder Beschreibereintrag zeigt auf eine Verknüpfungsliste von Verbindereinträgen 214 (CE-Liste) und einen Verbinderbeschreiber 215. Der Komponentenmanager erstellt einen Beschreibereintrag für jedes Protokoll, das durch die Benutzerkomponente vorgesehen wird. Der Komponentenmanager erstellt einen Verbindereintrag für jede Verbindung für das bestimmte Protokoll.
- Jeder Verbinderbeschreiber wird durch die Benutzerkomponente vorgesehen und beschreibt ein durch die Benutzerkomponente vorgesehenes Protokoll. Der Komponentenmanager 212 zeigt auf die Benutzerkomponente 216 und einen Komponentenbeschreiber 217. Der Komponentenbeschreiber wird durch die Benutzerkomponente vorgesehen und beschreibt Attribute der Komponente.
- Die vorliegende Erfindung gibt verschiedene Funktionen an, die zum Verbinden von Komponenten verwendet werden können. In einer Ausführungsform können diese Funktionen über eine Schnittstelle IComponent vorgesehen werden, die durch einen Komponentenmanager vorgesehen wird. Eine Basisfunktion ist die Funktion ComponentNewConnector, die einen Verbinder für das spezifizierte Protokoll erstellt. Um einen Verbinder zu erstellen, erstellt der Komponentenmanager einen neuen Verbindereintrag für das spezifizierte Protokoll und gibt einen Zeiger a auf die Schnittstelle IConnector des neuen Verbindereintrags aus. Wenn sowohl ein Steckerverbinder wie ein Buchsenverbinder für ein Protokoll erstellt werden, dann können diese durch die Funktion ComponentConnect verbunden werden. Die Funktion ComponentConnect speichert einen Zeiger auf die Umkehrschnittstelle in jeder Benutzerkomponente und initialisiert die Zustandsinformation, um die Verbindung zu verfolgen. Fig. 3 ist ein Blockdiagramm, das ein Beispiel einer Verbindung zwischen zwei Komponenten in einer bevorzugten Ausführungsform darstellt. Die Komponenten 301 und 311 sollen über das Protokoll IUSERJACK/IUSERPLUG verbunden werden. Die Komponente 301 enthält einen Komponentenmanager 302 und einen Beschreibereintrag 303, der die Schnittstelle IUSERJACK beschreibt. Die Komponente 301 wird aufgefordert, den Buchsenverbinder 304 für die Schnittstelle IUSERJACK zu erstellen. Der Komponentenmanager 302 sucht die Beschreibereinträge für den IUSERJACK-Schnittstelleneintrag 303 und erstellt den Buchsenverbinder 304. Der Buchsenverbinder 304 enthält einen Zeiger auf die durch die Benutzerkomponente 305 vorgesehene Schnittstelle IUSERJACK. Entsprechend enthält die Komponente 311 den Komponentenmanager 312 und den Beschreibereintrag 313, der die Schnittstelle IUSERPLUG beschreibt. Die Komponente 311 wird aufgefordert, den Steckerverbinder 314 für die Schnittstelle IUSERPLUG zu erstellen. Der Komponentenmanager 312 such die Beschreibereinträge für den IUSERPLUG-Schnittstelleneintrag und erstellt den Steckerverbinder 314. Der Steckerverbinder 314 enthält einen Zeiger auf die durch die Benutzerkomponente 315 vorgesehene Schnittstelle IUSERPLUG.
- Wenn der Buchsenverbinder 304 und der Steckerverbinder 314 erstellt wurden, können die Komponenten über diese Verbinder miteinander verbunden werden. In einer Ausführungsform wird eine Funktion ComponentConnect an den Buchsenverbinder 304 und den Stecker verbinder 314 gegeben, indem Zeiger auf die Schnittstellen IConnector weitergegeben werden. Die Funktion ComponentConnect setzt den Buchsenverbinder 304 und die Benutzerkomponente 305, daß diese auf die Schnittstelle IUSERPLUG zeigen (durch Strichlinien dargestellt). Entsprechend setzt die Funktion ComponentConnect den Steckerverbinder 314 und die Benutzerkomponente 315, daß diese auf die Schnittstelle IUSERJACK zeigen (durch Strichlinien dargestellt). Die Benutzerkomponenten 305 und 315 können jetzt über die Umkehrschnittstellenzeiger auf die Methoden der Umkehrschnittstellen zugreifen. CODETABELLE 2A GODETABELLE 2B
- Während der Erstellung der Komponenten sieht die Benutzerkomponente einen Komponentenbeschreiber für den Komponentenmanager vor. Die Codetabelle 2A enthält eine Komponentenbeschreiber-Datenstruktur. Der Komponentenbeschreiber enthält einen Zeiger auf eine Matrix von Verbinderbeschreibern (pConnDesc), eine Zählung der Anzahl der Einträge in der Matrix (cConnectors), einen Zeiger auf eine Rückmeldungsroutine in die Benutzerkomponente (*Create) und ein Flag (flag). Der Komponentenmanager ruft die Rückmeldungsroutine während des Erstellens der Komponente auf. Das Flag beschreibt, wie weiter unten erläutert, verschiedene Attribute der Komponente.
- Jeder Verbinderbeschreiber enthält die Schnittstellen-ID der durch die Benutzerkomponente vorgesehenen Schnittstelle (piid) und die entsprechende Umkehrschnittstellen-ID (piidm), einen Instanzenname (iname), die Maximalanzahl der Verbinder (cMaxConnectors), den Offset des Umkehrschnittstellenzeigers in der Benutzerkomponente (RevlfacePtrOff), verschiedene Rückmeldungsroutinen in die Benutzerkomponente und ein Flag (flag). Die Codetabelle 2B enthält eine Verbinderbeschreiber-Datenstruktur. Die Schnittstellen-ID spezifiziert die Schnittstelle des Protokolls, das durch die Benutzerkomponente vorgesehen wird, und die Umkehrschnittstellen-ID spezifiziert die Schnittstelle, welche die Benutzerkomponente von der zu verbindenden Komponente erwartet. Der Instanzenname wird verwendet, um mehrere Implementierungen desselben Protokolls zu unterscheiden, die durch die Benutzerkomponente vorgesehen werden. Die Maximalanzahl der Verbinder gibt die Maximalanzahl der Verbinder für das beschriebene Protokoll an, die gleichzeitig erstellt werden können. Der Offset des Umkehrschnittstellenzeigers in die Benutzerkomponente gibt dem Komponentenmanager die Position des Umkehrschnittstellenzeigers relativ zu dem vorgesehenen Schnittstellenzeiger an. Der Komponentenmanager benachrichtigt die Benutzerkomponente mit Hilfe von verschiedenen Rückmeldungsroutinen über Änderungen des Verbindungszustands. In einer bevorzugten Ausführungsform wird eine Benutzerkomponente mit Hilfe von Rückmeldungsroutinen darüber benachrichtigt, daß ein Verbinder erstellt, verbunden, getrennt und gelöscht wird. Das Flag beschreibt, wie weiter unten erläutert, verschiedene Attribute des Verbinders.
- Die vorliegende Erfindung gibt verschiedene Funktionen an, um Verbinder zu erstellen und um Verbindungen zwischen Komponenten herzustellen. Die Funktionen umfassen eine Funktion zum Erstellen eines neuen Verbinders (ComponentNewConnector), eine Funktion zum Verbinden von zwei Verbindern (Componentconnect), eine Funktion zum Trennen von zwei Verbindern (ComponentDisconnect) und eine Funktion zum Löschen eines Verbinders (ComponentDeleteConnector). Außerdem sieht eine bevorzugte Ausführungsform auch Funktionen zum Aufzählen der Verbinderbeschreiber und der Verbinder vor.
- Die vorliegende Erfindung sieht auch eine Funktion zum Initialisieren des Komponentenmanagers vor (ComponentInit). Wenn eine Benutzerkomponente erstellt wird, ruft die Komponentenklassenfabrik die Funktion ComponentInit auf, gibt die Klassen-ID der Benutzerkomponente und einen Komponentenbeschreiber aus, der auf eine Matrix von Verbinderbeschreibern zeigt. Die Funktion erstellt ein Komponentenmanagerobjekt und erstellt und verbindet die Benutzerkomponente. (Die Verbindung von Objekten ist in dem US-Patent US- A-5 805 885 mit dem Titel "METHOD AND SYSTEM FOR AGGREGATING OBJECTS" beschrieben.) Die Funktion erstellt außerdem die DE-Liste für die Matrix von Vebinderbeschreibern. Ein bevorzugter Prototyp der Funktion ComponentInit ist
- Der Parameter pUnkOuter zeigt auf die steuernde Schnittstelle IUnknown; der Parameter riid ist die Schnittstellen-ID der im Parameter ppIUnk auszugebenden Schnittstelle; der Parameter pCompDesc ist ein Zeiger auf den Komponentenbeschreiber; und der Parameter cIsid ist die Klassen-ID der Benutzerkomponente. Fig. 4 ist ein Flußdiagramm der Funktion ComponentInit. In Schritt 401 weist die Funktion ein Komponentenmanagerobjekt zu. In Schritt 402 initialisiert die Funktion den Komponentenmanager, indem sie die DE-Liste auf Leer setzt. In Schritt 403 erstellt die Funktion einen Beschreibereintrag und fügt denselben zu der DE-Liste in Übereinstimmung mit jedem in der Matrix der Verbinderbeschreiber spezifizierten Verbinderbeschreiber hinzu. In den Schritten 404-407 verbindet die Funktion die Komponente zu einem Aggregatobjekt, wenn der Parameter pUnkOuter nicht NULL ist. In Schritt 404 setzt die Funktion pUnkOuter für den Komponentenmanager gleich dem Parameter pUnkOuter. Wenn der Parameter pUnkOuter in Schritt 405 gleich NULL ist, dann fährt die Funktion in Schritt 406 fort, ansonsten fährt die Funktion in Schritt 407 fort. In Schritt 406 setzt die Funktion pUnkOuter des Komponentenmanagers, damit dieser auf die Schnittstelle IUnknown des Komponentenmanagers zeigt und fährt in Schritt 408 fort. Wenn die angeforderte Schnittstelle in Schritt 407 nicht die Schnittstelle IUnknown ist, dann schließt die Funktion ab. In Schritt 408 ruft die Funktion die Rückmeldungsroutine der im Komponentenbeschreiber spezifizierten Benutzerkomponente auf. Die Rückmeldungsroutine erstellt eine Benutzerkomponente und verbindet diese mit der Komponente. Die Funktion setzt den Komponentenmanager, damit dieser auf die Benutzerkomponente zeigt. In den Schritten 409 bis 414 ruft die Funktion einen Zeiger auf die Schnittstelle ab, die durch den Parameter riid spezifiziert wird. Wenn in Schritt 409 der Parameter pUnkOuter NULL ist, dann fährt die Funktion in Schritt 413 fort, ansonsten fährt die Funktion in Schritt 411 fort. In Schritt 411 setzt die Funktion die angeforderte Schnittstelle auf die Schnittstelle IUnknown. In Schritt 412 inkrementiert die Funktion die Referenzzählung des Komponentenmanagers und schließt ab.
- In Schritt 413 ruft die Funktion die angeforderte Schnittstelle ab, indem sie das Verfahren QueryInterface der steuernden Schnittstelle IUnknown aufruft. In Schritt 414 gibt die Funktion die angeforderte Schnittstelle aus.
- Wenn eine Komponente erstellt und initialisiert wurde, können Verbinder erstellt und verbunden werden. Die Funktion ComponentNewConnector erstellt einen Verbinder für die spezifizierte Schnittstellen-ID und gibt einen Zeiger auf die Schnittstelle IConnector des Verbinders aus. Ein bevorzugter Prototyp der Funktion ComponentNewConnector ist
- Der Parameter pCM zeigt auf den Komponentenmanager der Komponente; der Parameter riid ist die Schnittstellen-ID und der Parameter pName ist der Instanzenname des Beschreibereintrags, der das Protokoll beschreibt, für welches ein Verbinder erstellt werden soll; und der Parameter ppIConnector ist ein Zeiger auf den erstellten Verbinder. Der Verbinder enthält einen auf die durch die Benutzerkomponente vorgesehene Schnittstelle. Die Funktion ruft die Rückmeldungsroutine für den Beschreibereintrag auf, um den Zeiger auf die Schnittstelle abzurufen. In einer bevorzugten Ausführungsform ruft die Funktion ComponentNew- Connector eine Methode NewConnector der Schnittstelle IComponentJack des erhaltenen Komponentenmanagers auf, um einen neuen Verbinder zu erstellen. Die Methode New- Connector wird weiter unten erläutert.
- Eine Verbindung wird hergestellt, indem die Funktion ComponentConnect aufgerufen wird. Diese Funktion erhält Zeiger auf zwei Verbindern (Schnittstelle IConnector). Die Funktion bestimmt, welcher Verbinder ein Stecker und welcher Verbinder eine Buchse ist, und stellt sicher, daß diese Umkehrschnittstellen eines Protokolls wiedergeben. Die Funktion ruft dann die Methode Connect des Buchsenverbinders und dann die Methode ConnectAndNotify des Steckerverbinders auf. Wenn die Methode Connect des Buchsenverbinders eine Angabe ausgibt, daß der Buchsenverbinder benachrichtigt werden soll, wenn die Methode Connect-AndNotify des Steckerverbinders abschließt, dann ruft die Funktion die Methode NotifyDid-Connect des Buchsenverbinders auf. Die Benutzerkomponente von einer der Komponenten kann über die Verbindungsrückmeldung benachrichtigt werden, die in dem Verbinderbeschreiber spezifiziert ist. Konventionell wird die Benutzerkomponente des Steckerverbinders durch den Komponentenmanager über die Verbindung benachrichtigt, bevor die Benutzerkomponente des Buchsenverbinders benachrichtigt wird. Ein Steckerverbinder kann also verwendet werden, um eine verbindungsspezifische Initialisierung durchzuführen. Ein bevorzugter Prototyp der Funktion ComponentConnect ist
- Die Parameter pIConnector1 und pIConnector2 zeigen auf die zu verbindenden Verbinder. Fig. 5 ist ein Flußdiagramm der Funktion ComponentConnect. In Schritt 501 bestimmt die Funktion, welcher Verbinder ein Stecker ist. Wenn die Verbinder in Schritt 502 keine Umkehrschnittstellen eines Protokolls wiedergeben, dann gibt die Funktion eine Fehlermeldung aus. In Schritt 503 ruft die Funktion die Methode Connect des Buchsenverbinders auf und gibt einen Zeiger an den Steckerverbinder. Die Methode Connect gibt ein Flag aus, das angibt, ob der Buchsenverbinder darüber benachrichtigt werden soll, wenn die Verbindung zu dem Steckerverbinder hergestellt ist. In Schritt 504 ruft die Funktion die Methode ConnectAndNotify des Steckerverbinders auf und gibt einen Zeiger an den Buchsenverbinder. Wenn der Buchsenverbinder in Schritt 505 nicht benachrichtigt werden soll, dann schließt die Funktion ab. In Schritt 506 ruft die Funktion die Methode NotifyDidConnect des Buchsenverbinders auf und schließt ab. Wenn eine Verbindung hergestellt ist, können die Benutzerkomponenten die Umkehrschnittstellenzeiger verwenden, um auf Methoden der Schnittstelle zuzugreifen.
- Eine Verbindung wird getrennt, indem die Funktion ComponentDisconnect aufgerufen wird. Die Funktion ComponentDisconnect stellt sicher, daß die erhaltenen Verbinder verbunden sind, und bestimmt, welcher Verbinder der Steckerverbinder und welcher Verbinder der Buchsenverbinder ist. Die Funktion ruft dann die Methode NotifyWillDisconnect des Steckerverbinders, die Methode NotifyAndDisconnect des Buchsenverbinders und die Methode Disconnect des Steckerverbinders auf. Ein bevorzugter Prototyp der Funktion Component- Disconnect ist
- Die Parameter pIConnector1 und pIConnector2 zeigen auf die Schnittstellen IConnector der zu verbindenden Verbinder. Fig. 6 ist ein Flußdiagramm der Funktion ComponentDisconnect. Wenn in Schritt 601 die erhaltenen Verbinder nicht verbunden sind, dann gibt die Funktion eine Fehlermeldung aus. In Schritt 602 bestimmt die Funktion, welcher Verbinder ein Stecker und welcher Verbinder eine Buchse ist. In Schritt 603 ruft die Funktion die Methode Notify- WillDisconnect des Steckerverbinders auf. In Schritt 604 ruft die Funktion die Methode NotifyAndDisconnect des Buchsenverbinders auf. In Schritt 605 ruft die Funktion die Methode Disconnect des Steckerverbinders auf. In Schritt 606 gibt die Funktion den Stecker- und den Buchsenverbinder frei und schließt ab. CODETABELLE 3
- Die Codetabelle 3 enthält die Schnittstellenbeschreibungen für die Schnittstellen IJack und IPlug. Ein Buchsenverbinder sieht die Schnittstelle IJack vor, und ein Steckerverbinder sieht die Schnittstelle IPlug vor. Die Methoden dieser Schnittstellen werden verwendet, um die Verbindung zwischen Komponenten herzustellen.
- Fig. 7 ist ein Flußdiagramm der Methode Connect der Schnittstelle IJack. Die Methode erhält einen Zeiger auf einen Stecker (pIP) und verbindet die Buchse (durch den Zeiger "this" angegeben) mit diesem Stecker. Die Methode gibt einen Bezeichner der Buchsen- und der Steckerschnittstelle (pJackIID und pPlugIID), ein beschreibendes Flag für die Buchse (pCDFlag) und ein Flag aus, das angibt, ob diese Buchse benachrichtigt werden soll, wenn die Verbindung hergestellt ist (pFlag). Wenn in Schritt 701 die Buchse gerade verbunden wird oder verbunden ist, dann gibt die Methode eine Fehlermeldung aus. Wenn in Schritt 702 die Benutzerkomponente für diese Buchse benachrichtigt werden möchte, was durch die Verbindungsrückmeldung angegeben wird, dann fährt die Methode in Schritt 703 fort, ansonsten fährt die Methode in Schritt 704 fort. In Schritt 703 setzt die Methode die Buchse, daß sie die Verbindungsherstellung angibt. In Schritt 704 setzt die Methode die Buchse, daß sie die Verbindung angibt. In Schritt 705 ruft die Methode einen Zeiger auf die Steckerschnittstelle von dem erhaltenen Stecker ab. In Schritt 706 setzt die Methode den Umkehrschnittstellenzeiger dieser Buchse. In Schritt 707 setzt die Methode den Umkehrschnittstellenzeiger der Benutzerkomponente und schließt ab.
- Fig. 8 ist ein Flußdiagramm der Methode NotifyDidConnect der Schnittstelle IJack. Diese Methode benachrichtigt die Benutzerkomponente über die Verbindung. Wenn in Schritt 801 die Buchse nicht gerade verbunden wird, dann gibt die Methode eine Fehlermeldung aus. In Schritt 802 setzt die Methode diese Buchse, daß sie den verbundenen Zustand und die nicht erfolgende Verbindungsherstellung angibt. In Schritt 803 ruft die Methode die Verbindungs rückmeldungsroutine der Benutzerkomponente wie durch den Beschreibereintrag dieser Buchse angegeben auf und schließt ab.
- Fig. 9 ist ein Flußdiagramm der Methode NotifyAndDisconnect der Schnittstelle IJack. Wenn in Schritt 901 die Buchse nicht verbunden wird, dann gibt die Methode eine Fehlermeldung aus. Wenn in Schritt 902 die Benutzerkomponente über die Verbindungstrennung benachrichtigt werden soll, dann ruft die Methode in Schritt 903 die Trennungsrückmeldungsroutine auf. In Schritt 904 setzt die Methode die Buchse, daß diese den nicht verbundenen Zustand und die nicht erfolgende Verbindungsherstellung angibt. In Schritt 905 gibt die Methode die Steckerschnittstelle frei und schließt ab.
- Fig. 10 ist ein Flußdiagramm der Methode Disconnect der Schnittstelle IJack. Wenn in Schritt 1001 die Buchse nicht verbunden ist oder gerade verbunden wird, dann gibt die Methode eine Fehlermeldung aus. In Schritt 1002 setzt die Methode die Buchse, daß diese den nicht verbundenen Zustand und die nicht erfolgende Verbindungsherstellung angibt. In Schritt 1003 gibt die Methode die Steckerschnillstelle frei und schließt ab.
- Fig. 11 ist ein Flußdiagramm der Methode ConnectAndNotify der Schnittstelle IPlug. Wenn in Schritt 1101 der Stecker bereits verbunden ist, dann gibt die Methode eine Fehlermeldung aus. In Schritt 1102 ruft die Methode einen Zeiger auf die verbundene Buchsenschnittstelle ab. In Schritt 1103 setzt die Methode den Umkehrschnittstellenzeiger in diesem Stecker, daß dieser auf die Buchsenschnittstelle zeigt. In Schritt 1104 setzt die Methode den Umkehrschnittstellenzeiger der Benutzerkomponente, daß dieser auf die Buchsenschnittstelle zeigt. Wenn in Schritt 1105 die Benutzerkomponente über die Verbindung benachrichtigt werden soll, dann ruft die Methode in Schritt 1106 die Verbindungsrückmeldungsroutine dieses Steckers auf. Die Methode schließt dann ab.
- Fig. 12 ist ein Flußdiagramm der Methode NotifyWillDisconnect der Schnittstelle IPlug. Wenn in Schritt 1201 der Stecker nicht verbunden ist, dann gibt die Methode eine Fehlermeldung aus. Wenn in Schritt 1202 die Benutzerkomponente über die Verbindungstrennung benachrichtigt werden soll, dann ruft die Methode in Schritt 1203 die Trennungsrückmeldungsroutine auf. In Schritt 1204 setzt das Verfahren den Stecker, daß dieser den nicht verbundenen Zustand und die nicht erfolgende Verbindungsherstellung angibt, und schließt ab.
- Fig. 13 ist ein Flußdiagramm der Methode Disconnect der Schnittstelle IPlug. Wenn in Schritt 1301 der Stecker nicht gerade getrennt wird, dann gibt die Methode eine Fehlermeldung aus.
- In Schritt 1302 gibt die Methode die Buchsenschnittstelle frei. In Schritt 1303 setzt die Methode diesen Stecker, um den nicht verbundenen Zustand und die nicht erfolgende Verbindungstrennung anzugeben, und schließt dann ab. CODETABELLE 4
- Der Komponentenmanager sieht verschiedene Schnittstellen für die Verwendung bei der Verwaltung von Verbindungen zwischen Komponenten vor. Die Codetabelle 4 enthält eine Beschreibung der Schnittstelle IComponentJack. Die Schnittstelle definiert vier Methoden. Die ersten zwei Methoden EnumerateDescriptors und EnumerateConnectors sehen einen Mechanismus zum Aufzählen der Verbinderbeschreiber und Verbinder vor. Die Methoden geben dann einen Zeiger auf eine Aufzählerschnittstelle aus. Die Aufzählerschnittstelle weist eine Methode Next auf, die verwendet werden kann, um die Verbinderbeschreiber oder Verbinder seriell abzurufen. Die Methode EnumerateDescriptors sieht die Aufzählung jedes Verbinderbeschreibers vor. Die Methode erhält eine Schnitstellen-ID, einen Instanzennamen und ein Flag. Die Methode gibt einen Zeiger auf einen Aufzähler für alle Verbinderbeschreiber oder nur für die Verbinderbeschreiber aus, die auf der Basis des erhaltenen Flags mit der Schnittstellen-ID oder dem Instanzennamen übereinstimmen. Die Methode Enumerate- Connectors sieht die Aufzählung aller erstellten Verbinder eines spezifizierten Verbinder beschreibers vor. Die Methode erhält eine Schnittstellen-ID und einen Instanzennamen, um einen Verbinderbeschreiber zu spezifizieren, und gibt einen Zeiger auf einen Aufzähler aus. Die Methode NewConnector der Schnittstelle IComponentJack erstellt einen Verbinder für den spezifizierten Verbinderbeschreiber und gibt einen Zeiger auf den Verbinder aus. Die Methode erhält eine Schnittstellen-ID (DescIID) und einen Instanzennamen eines Verbinderbeschreibers (IpszName). Fig. 14 ist ein Flußdiagramm der Methode NewConnector der Schnittstelle IComponentJack. In Schritt 1401 wählt die Methode einen Beschreibereintrag in Übereinstimmung mit der erhaltenen Schnittstellen-ID und dem Instanzennamen aus. Wenn in Schritt 1402 kein Beschreibereintrag ausgewählt ist, dann gibt die Methode eine Fehlermeldung aus. In Schritt 1403 erstellt die Methode einen Verbindereintrag für den ausgewählten Beschreibereintrag und schließt ab. Die Methode ruft die Methode Extrude des ausgewählten Beschreibereintrags auf. Die Methode DeleteConnector der Schnittstelle IComponentJack funktioniert in analoger Weise, um einen erstellten Verbinder zu entfernen. In einer bevorzugten Ausführungsform enthält ein Beschreibereintrag Zustandsinformation einschließlich eines Zeigers auf die Verbinderbeschreiber, der maximalen Anzahl von Verbindern, die für diesen Beschreibereintrag erstellt werden kann, der Anzahl der gegenwärtig erstellten Verbinder, eines Zeigers auf die CE-Liste, eines Verbindungs-ID-Generators, der beim Erzeugen von eindeutigen Bezeichnern für die Verbinder hilft, und eines Flags zum Aufrechterhalten des Zustands des Beschreibereintrags. Wie weiter unten beschrieben, kann der Zustand eines Beschreibereintrags privat, Projektion oder projiziert sein. CODETABELLE 5
- Die Codetabelle 5 enthält eine Beschreibung der Schnittstelle IDescriptorEntry. Die Schnittstelle definiert die Methode Extrude, die einen Zeiger auf einen neu erzeugten Verbindereintrag ausgibt. Die Methode erhält einen Zeiger auf eine Manifestationskomponente (pICManifesting) (weiter unten beschrieben), ein Flag (CEflag) und einen Zeiger auf die Benutzerkomponente (pComponent) und gibt einen Zeiger auf den neu erstellen Verbinder (ppIConnector) aus. Fig. 15 ist ein Flußdiagramm der Methode Extrude der Schnittstelle IDescriptorEntry. Wenn in Schritt 1501 bereits die Maximalanzahl von Verbindern für den Verbinderbeschreiber erstellt wurden, dann gibt die Methode eine Fehlermeldung aus. In Schritt 1502 erstellt und initialisiert die Methode einen Verbindereintrag. In Schritt 1503 verknüpft die Methode den Verbindereintrag in der CE-Liste des Beschreibereintrags. In Schritt 1504 inkrementiert die Methode die Anzahl der Verbinder, die für diesen Beschreibereintrag erstellt wurden. In Schritt 1505 setzt die Methode die Verbindungs-ID des Verbindereintrags. Jeder Verbindereintrag für einen Beschreibereintrag hat eine eindeutige Verbindungs-ID. In Schritt 1506 inkrementiert die Methode den Verbindungs-ID-Generator dieses Beschreibereintrags. Der Verbindungs-ID-Generator sieht eine eindeutige Verbindugns-ID vor. In Schritt 1507 ruft die Methode die Rückmeldungsroutine der durch den Verbinderbeschreiber angegebenen Benutzerkomponente auf, gibt einen Zeiger auf die Benutzerkomponente aus und schließt ab. Die Rückmeldungsroutine gibt einen Zeiger auf die Schnittstelle des Protokolls aus, das durch die Benutzerkomponente vorgesehen wird. In einer bevorzugten Ausführungsform enthält ein Verbindereintrag eine eindeutige Verbindungs-ID für den Beschreibereintrag, einen Zeiger auf die durch die Benutzerkomponente vorgesehene Schnittstelle, einen Umkehrschnittstellenzeiger, einen Zeiger auf einen Moniker des anderen Verbinders, einen Zeiger auf die sich Manifestationskomponente und ein Flag, das Zustandsinformation enthält. Die Zustandsinformation gibt an, ob der Verbinder verbunden ist, gerade verbunden wird oder gerade getrennt wird und ob der andere Verbinder ein Stub ist (weiter unten beschrieben).
- Eine bevorzugte Ausführungsform sieht ein "Lazy Binding" zu Umkehrschnittstellen vor. Wenn eine Verbindung mit einem Lazy Binding hergestellt wird, werden die Umkehrschnittstellenzeiger des Verbinders und der Benutzerkomponente gesetzt, daß sie auf ein Stub für die Umkehrschnittstelle und nicht auf die "echte" Umkehrschnittstelle zeigen, die durch die verbundene Komponente vorgesehen wird. Das Stub ist eine andere Implementierung der Umkehrschnittstelle. Wenn eine der Methoden des Stubs aufgerufen wird, bindet die Methode die Umkehrschnittstelle und ersetzt die Umkehrschnittstellenzeiger des Verbinders und der Benutzerkomponente durch einen Zeiger zu der gebundenen Umkehrschnittstelle. Jede Methode ruft dann die entsprechende Methode der Umkehrschnittstelle auf. Auf diese Weise kann die Bindung zu einer Umkehrschnittstelle verzögert werden, bis tatsächlich durch eine Benutzerkomponente auf die Umkehrschnittstelle zugegriffen wird. Jeder Verbinderbeschreiber enthält vorzugsweise einen Zeiger auf eine Klassenfabrik, um das Umkehrschnittstellen- Stub zu erzeugen. Obwohl jede Stub-Methode durch einen Benutzerkomponenten-Autor implementiert wird, ruft sie vordefinierte Funktionen auf, um Information von dem Verbinder abzurufen, die erforderlich ist, um die Umkehrschnittstelle zu binden. Auf diese Weise ist es nicht erforderlich, daß der Autor der Benutzerkomponente über Wissen zu dem internen Aufbau des Komponentenmanagers verfügt. Wenn keine Stub-Klassenfabrik in einem Verbinderbeschreiber spezifiziert ist, dann wird kein Lazy Binding vorgenommen.
- Fig. 16 ist ein Blockdiagramm, das ein Lazy Binding darstellt. Wenn ein Verbindereintrag zuerst erstellt wird, wird der Verbindereintrag gesetzt, daß er auf ein Stub für die Umkehrschnittstelle zeigt. Das Stub sieht eine Lazy Binding-Implementierung der Umkehrschnittstelle vor. Wenn eine Methode des Stubs aufgerufen wird, bindet die Methode die durch den Umkehrschnittstellen-Moniker (weiter unten beschrieben) angegebene Umkehrschnittstelle. In Fig. 16 zeigt der Umkehrschnittstellenzeiger (previnterface) des Verbindereintrags 1601 auf das Stub 1603. Weiterhin zeigt der Umkehrschnittstellenzeiger der Benutzerkomponente 1602 auf das Stub 1603. Das Stub 1603 enthält interne Information, einschließlich eines Zeigers auf den Verbindereintrag 1601. Die Virtuellfunktionstabelle 1604 zeigt auf jede Stub- Methode 1605. Wenn eine Verbindung hergestellt wird, wird der Verbindereintrag 1601 gesetzt, daß er auf einen Umkehrschnittstellen-Moniker 1607 zeigt. Wenn die Benutzerkomponente über den Umkehrschnittstellenzeiger auf eine Methode zugreift, wird eine Stub-Methode aufgerufen. Wie durch den Pseudocode von method1 1605 gezeigt, bindet jede Stub- Methode die durch den Umkehrschnittstellen-Moniker identifizierte Umkehrschnittstelle, setzt die Umkehrschnittstellenzeiger, daß sie auf die gebundene Umkehrschnittstelle zeigen, ruft die entsprechende Methode der gebundenen Umkehrschnittstelle auf und schließt dann ab.
- Um das Lazy Binding zu implementieren, wird jeder Komponente ein Komponenten-Moniker zugewiesen, der die Komponente eindeutig identifiziert. Jeder Verbinder erzeugt einen Verbinder-Moniker, der den Verbinder in der Komponente eindeutig identifiziert. Der Verbinder- Moniker enthält die Schnittstellen-ID, den Instanzennamen und die Verbindungs-ID, um eine eindeutige Identifikation vorzusehen. Die Methode GetMoniker (weiter unten beschrieben) der Schnittstelle IConnector gibt einen Verbinder-Moniker für den Verbinder aus. Wenn eine Verbindung erstellt wird, wird für jeden Verbinder ein Verbinder-Moniker für die Umkehrschnittstelle vorgesehen. (Moniker werden ausführlich in dem US-Patent US-A-5 581 760 "METHOD AND SYSTEM FOR NAMING AND BINDING OBJECTS" beschrieben.) Wenn eine Bindung über ein Umkehrschnittstellen-Stub erfolgt, wird die Methode BindToObject des Umkehrschnittstellen-Monikers aufgerufen.
- In einer bevorzugten Ausführungsform können Verbindungen in dem Verbinderbeschreiber als dauerhaft oder nicht-dauerhaft designiert werden. Ein nicht-dauerhafter Verbinder wird freigegeben, wenn alle Referenzen auf ihn abgeschlossen sind (d. h. wenn die Referenzzählung gleich 0 ist). Ein dauerhafter Verbinder dagegen wird nicht freigegeben, wenn alle Referenzen auf ihn abgeschlossen sind. Wenn ein dauerhafter Verbinder verbunden wird, wird ein Moniker, der die Umkehrschnittstelle identifiziert, in dem Verbinder gespeichert. Die Methoden des Umkehrschnittstellen-Stubs verwenden diesen Moniker, um die Umkehrschnittstelle zu binden. Wenn ein nicht-dauerhafter Verbinder verbunden wird, dann wird dabei die Umkehrschnittstelle gebunden und werden die Umkehrschnittstellenzeiger gesetzt, daß sie auf die echte Umkehrschnittstelle zeigen.
- Eine Ausführungsform der vorliegenden Erfindung sieht ein Sammelsenden einer Nachricht zu allen über ein Protokoll verbundenen Komponenten vor. Eine Nachricht wird sammelgesendet, indem eine Methode jedes verbundenen Verbinders in einem spezifizierten Verbinderbeschreiber aufgerufen wird. Die Funktion GetMulticastStub gibt einen Zeiger auf eine Sammelsende-Stub-Implementierung der Umkehrschnittstelle aus. Die Funktion erhält eine Schnittstellen-ID und einen Instanzennamen und gibt einen Zeiger auf das Sammelsende- Stub aus. Um eine Nachricht sammelzusenden, ruft die Benutzerkomponente eine Methode des Sammelsende-Stubs auf. Jede Methode des Sammelsende-Stubs ruft die entsprechende Methode der Umkehrschnittstelle jedes verbundenen Verbinders auf. Fig. 17 ist ein Blockdiagramm, das eine bevorzugte Implementierung des Sammelsendeschnittstellen-Stubs zeigt. Der Beschreibereintrag 1701 zeigt auf Verbindereinträge 1702-1703. Der Verbindereintrag 1702 ist verbunden, aber noch nicht gebunden; der Verbindereintrag 1702 zeigt auf den Lazy Binding-Stub 1704 als auf seinen Umkehrschnittstellenzeiger. Der Verbindereintrag 1703 ist gebunden und zeigt auf die Umkehrschnittstelle 1705. Der Verbindereintrag 1706 zeigt auf den Beschreibereintrag 1701. Jede Methode des Sammelsende-Stubs 1706 zeigt auf die Verituellfunktionstabelle 1707. Jede Methode des Sammelsende-Stubs 1708 durchläuft die Verbindereintragsliste, und wenn ein Verbindereintrag verbunden ist, dann ruft die Methode die entsprechende Methode der Umkehrschnittstelle auf. Das Sammelsenden einer Nachricht ist logisch dem Aufzählen jedes Verbinders und dem Aufrufen einer Methode der Umkehrschnittstelle äquivalent. Eine Methode, die einen Parameter ausgibt, kann nicht mit Hilfe dieses Mechanismus sammelgesendet werden.
- Fig. 17A ist ein Flußdiagramm, das eine beispielhafte Methode eines Stubs darstellt. Das Umkehrschnittstellen-Stub und ein Sammelsende-Stub teilen sich dieselbe Implementierung. Die Stub-Methode durchläuft eine Schleife für das Aufrufen der Funktion ConnectorStub- Implementation, die durch den Komponentenmanager vorgesehen wird. Diese Funktion gibt einen Zeiger auf eine Umkehrschnittstelle aus. Die Stub-Methode ruft die entsprechende Methode der Umkehrschnittstelle auf. Wenn die Funktion einen Ausgabewert Falsch ausgibt, dann schließt die Stub-Methode ab. Wenn ein Sammelsenden durchgeführt wird, durchläuft die Stub-Methode eine Schleife zum Empfangen von Umkehrschnittstellenzeigern. Wenn kein Sammelsenden durchgeführt wird, wird nur der Umkehrschnittstellenzeiger ausgegeben. In Schritt 1751 ruft die Methode die Funktion ConnectorStubImplementation auf, welche einen Umkehrschnittstellenzeiger und einen Ausgabewert ausgibt. Wenn in Schritt 1752 der Ausgabewert Falsch ist, dann schließt die Methode ab. In Schritt 1753 ruft die Methode die entsprechende Methode der Umkehrschnittstelle auf und kehrt zu Schritt 1751 zurück. Die Funktion ConnectorStubImplementation bestimmt auf der Basis von im Stub gespeicherter interner Information, ob sie durch ein Umkehrschnittstellen-Stub oder ein Sammelsende-Stub aufgerufen wird. CODETABELLE 6
- Die Codetabelle 6 enthält eine Beschreibung der Schnittstelle IConnector. Jeder Verbindereintrag sieht diese Schnittstelle vor, um die Verbindung zu manipulieren. Die Methode Get- Moniker gibt den Moniker für diesen Verbinder aus. Die Methode erstellt einen Verbinder- Moniker und setzt Datenglieder für die Schnittstellen-ID, den Instanzennamen und die Verbindungs-ID für diesen Verbinder. Die Methode verbindet dann den Verbinder-Moniker mit dem Komponenten-Moniker für die Manifestationskomponente und schließt ab. Die Mani festationskomponente ist die Komponente, die diesen Verbinder erstellt. Die Methode Get- Owner gibt einen Zeiger auf die Manifestationskomponente dieses Verbinders aus. Die Methode IsConnected gibt den Wert Wahr aus, wenn dieser Verbinder gegenwärtig verbunden ist. Die Methode GetInfo sammelt den Schnittstellen-Bezeichner, die Umkehrschnittstellen- ID, den Instanzennamen und ein Statusflag dieses Verbinders und gibt dieselben aus. Die Methode ReleaseMate ruft die Freigabemethode der Umkehrschnittstelle auf und erstellt ein Umkehrschnittstellen-Stub. Die Methode SetMateConnector setzt den Umkehrschnittstellenzeiger dieses Verbinders und die Benutzerkomponente auf die erhaltene Schnittstelle. Die Methode setzt diesen Verbinder auf den verbundenen. Die Methode GetMateConnector bindet das Stub, wenn dieses noch nicht gebunden ist, und gibt den Zeiger an die Umkehrschnittstelle aus.
- Der Komponentenmanager sieht einen Mechanismus zum Passivieren (Trennen) einer Verbindung vor. Die Schnittstelle oder die Umkehrschnittstelle einer Verbindung können passiviert werden. Ein Verbinder wird passiviert, indem die Umkehrschnittstelle (wenn es kein Umkehrschnittstellen-Stub ist) freigegeben wird oder durch ein Umkehrschnittstellen- Stub ersetzt wird. Der Umkehrverbinder wird passiviert, indem die Methode ReleaseMate der Schnittstelle IConnector aufgerufen wird. Eine Verbindung wird durch die Methode Passivate der Schnittstelle IConnector passiviert. Die Methode erhält eine Angabe darüber, ob ein Umkehrschnittstellen-Stub gelassen werden soll und ob auch der andere Verbinder passiviert werden soll. Fig. 18 ist ein Flußdiagramm der Methode Passivate der Schnittstelle IConnector. Wenn in Schritt 1801 das erhaltene Flag angibt, daß nur die Verbindung zu der Umkehrschnittstelle passiviert werden soll, dann fährt die Methode in Schritt 1806 fort, ansonsten fährt die Methode in Schritt 1802 fort. Wenn in Schritt 1802 dieser Verbinder nicht mit der Umkehrschnittstelle gebunden ist oder mit einem Umkehrschnittstellen-Stub gebunden ist, dann fährt die Methode in Schritt 1803 fort, ansonsten fährt die Methode in Schritt 1804 fort. In Schritt 1803 bindet das Verfahren die Umkehrschnittstelle und ruft einen Zeiger auf die Schnittstelle IConnector des anderen Verbinders ab. In Schritt 1804 ruft die Methode einen Zeiger auf die Schnittstelle IConnector des anderen Verbinders ab. In Schritt 1805 ruft die Methode die Methode ReleaseMate des anderen Verbinders auf, um den anderen Verbinder dazu aufzufordern, die durch diesen Verbinder vorgesehene Schnittstelle freizugeben. Wenn in Schritt 1806 dieser Verbinder mit einem Umkehrschnittstellen-Stub gebunden ist, dann fährt die Methode in Schritt 1807 fort, ansonsten fährt die Methode in Schritt 1809 fort. Wenn in Schritt 1807 das erhaltene Flag angibt, daß ein Umkehrschnittstellen-Stub gelassen werden soll, dann schließt die Methode ab. In Schritt 1808 gibt die Methode das Umkehrschnittstellen-Stub frei, setzt die Umkehrschnittstellenzeiger auf NULL und schließt ab. In Schritt 1809 gibt die Methode die Umkehrschnittstelle frei, indem sie die Methode Release aufruft. Wenn in Schritt 1810 das erhaltene Flag angibt, daß kein Stub gelassen werden soll, dann schließt die Methode ab. In Schritt 1811 erstellt die Methode ein Umkehrschnittstellen- Stub, setzt die Umkehrschnittstellenzeiger und schließt ab.
- Der umgekehrte Prozeß zu der Passivierung einer Verbindung ist die Bindung zu einer Verbindung. Fig. 19 ist ein Flußdiagramm der Methode BindStub der Schnittstelle IConnector. Wenn in Schritt 1901 dieser Verbinder nicht mit einem Stub verbunden ist, dann gibt die Methode eine Fehlermeldung aus. In Schritt 1902 bindet die Methode die Umkehrschnittstelle, indem sie die Methode BindToObject des Umkehrschnittstellen-Monikers aufruft. In Schritt 1903 setzt die Methode diesen Verbinder, um anzugeben, daß er nicht mit einem Stub verbunden ist. In Schritt 1904 setzt die Methode die Umkehrschnittstellenzeiger, daß diese auf die gebundene Umkehrschnittstelle zeigen. In den Schritten 1905 und 1906 verbindet die Methode optional den anderen Verbinder und setzt die Umkehrschnittstellenzeiger. In Schritt 1905 ruft die Methode die Schnittstelle IConnector des anderen Verbinders auf. In Schritt 1906 setzt die Methode die Umkehrschnittstellenzeiger des anderen Verbinders, daß diese auf die Schnittstelle zeigen, die durch diesen Verbinder vorgesehen wird, und schließt ab. Die Schnittstelle IConnect sieht die Methode SetMateConnector vor, die einen Zeiger auf eine Umkehrschnittstelle erhält, setzt den zu verbindenden Verbinder und setzt die Umkehrschnittstellenzeiger.
- Eine bevorzugte Ausführungsform der vorliegenden Erfindung ermöglicht, daß Komponenten in einer Containerkomponente eingebettet werden. Die eingebettete Komponente ist eine Kindkomponente (Kind), und die Containerkomponente ist eine Elternkomponente (Elter). Die Verbinderbeschreiber der Kindkomponenten können auf die Elternkomponente "projiziert" werden. Für einen Benutzer der Elternkomponente erscheint ein projizierter Verbinderbeschreiber einfach als ein weiterer Verbinder der Elternkomponente. Fig. 20 ist ein Blockdiagramm, das eine Elternkomponente und eine Kindkomponente darstellt. Ein Elter ist mit seinen Kindern über das IComponentPlug/IComponentJack-Protokoll (Elter-Kind-Protokoll) verbunden. Jede Komponente, die ein Elter ist, weist einen Verbinderbeschreiber auf, der die Schnittstelle IComponentPlug und die Umkehrschnittstelle IComponentJack spezifiziert. Die Verbinderbeschreibermatrix enthält also einen Eintrag für das IComponentPlug/IComponent- Jack-Protokoll für jede Komponente, die eine Elternkomponente sein kann. Jede Komponente wird automatisch mit einem Verbinderbeschreiber für die Schnittstelle IComponentJack und die Umkehrschnittstelle IComponentPlug erstellt. Auf diese Weise können beliebige Komponenten in einem Elter eingebettet werden. Die CE-Liste für den Beschreibereintrag für das Elter-Kind-Protokoll enthält einen Verbinder für jedes Kind. Fig. 20 zeigt eine Elternkomponente 2010 und ein Kind 2020. Der Elter 2010 umfaßt einen Komponentenmanager 2011 und eine DE-Liste mit Beschreibereinträgen 2012 und 2015. Der Beschreibereintrag 2012 unterstützt das Elter-Kind-Protokoll. Die CE-Liste des Beschreibereintrags 2012 enthält Verbinder 2013 und 2014. Der Verbinder 2014 ist mit dem Kind 2020 verbunden. Das Kind 2020 umfaßt einen Komponentenmanager 2021 und eine DE-Liste mit Beschreibereinträgen 2022 und 2025. Der Beschreibereintrag 2022 unterstützt das Elter-Kind-Protokoll. Der Verbinder 2024 stellt eine Verbindung mit dem Elter 2010 her. Der Beschreibereintrag 2015 ist eine Projektion des Beschreibereintrags 2025 des Kindes auf den Elter. Wenn ein Beschreibereintrag von einem Kind auf einen Elter projiziert wird, wird ein neuer Beschreibereintrag zu dem Elter mit einer Angabe hinzugefügt, daß es eine Projektion ist. Der projizierte Beschreibereintrag des Kindes wird gesetzt, um anzugeben, daß er projiziert ist. Wenn ein Verbinder aus einem Projektions-Beschreibereintrag erstellt wird, wird ein Verbinder 2016 für den Elter erstellt. Wie durch Strichlinien angegeben, sieht ein Projektions-Beschreibereintrag keine Schnittstelle IConnector, IJack oder IPlug vor. Wenn ein Verbinder aus einem Projektions- Beschreibereintrag erstellt wird, wird die Schnittstelle IConnector des Kindes ausgegeben. Der Elter ruft eine Methode des Kindes auf, damit das Kind einen entsprechenden Verbinder 2026 erstellen kann. Wenn das Kind selbst ein Elter ist und der erstellte Verbinder eine Projektion ist, dann wird das Kind des Kindes aufgerufen, um den Verbinder zu erstellen. Die Elter-Kind-Beziehungen können eine beliebige Stufe der Verschachtelung aufweisen. Wenn ein projizierter Verbinder erstellt wird, dann wird ein Zeiger auf den projizierten Verbinder ausgegeben. Verbindungen werden also direkt zu dem Verbinder des Kindes erstellt. Das IComponentPlug/IComponentJack-Protokoll in ein unidirektionales Protokoll. Der Elter sieht keine Implementierung der Schnittstelle IComponentPlug vor. Statt dessen wird wie bei einem anderen unidirektionalen Protokoll nur die Schnittstelle IUnknown implementiert. Die Schnittstelle IComponentJack wird durch den Komponentenmanager wie oben beschrieben vorgesehen.
- Die Funktion ComponentCreateChild erstellt eine Kindkomponente der spezifizierten Klasse für den spezifizierten Elter und verbindet das Kind mit dem Elter. Die Elternkomponente sollte einen Vollpfad-Moniker aufweisen, und die Funktion setzt den Elter-Moniker und den Moniker des Kindes. In einer bevorzugten Ausführungsform enthält ein Komponentenmanager einen Vollpfad-Moniker, einen Eltern-Moniker und einen This-Moniker. Der Eltern- Moniker ist ein Moniker, der den Elter eines Kindes identifiziert. Der This-Moniker ist ein Moniker, der ein Kind des Elter identifiziert. Wenn die Komponente kein Kind ist, dann identifiziert dieser Moniker die Komponente. Der Vollpfad-Moniker ist die Verbindung aus dem Elter-Moniker mit dem This-Moniker. Ein bevorzugter Prototyp für die Funktion ComponentCreateChild ist
- Der Parameter pComponentManager ist ein Zeiger auf die Elternkomponente; die Parameter dwIClsContext und rcid geben die Klassen-ID des Kindes wieder. Die Funktion gibt einen Zeiger zu der Schnittstelle IComponentPlug aus, die durch das Kind vorgesehen wird. Fig. 21A und 21B bilden ein Flußdiagramm der Funktion ComponentCreateChild. Wenn in Schritt 2101 die Elternkomponente keinen Vollpfad-Moniker aufweist, dann gibt die Methode eine Fehlermeldung aus. In Schritt 2102 wählt die Methode einen Beschreibereintrag der Elternkomponente für die Schnittstelle IComponentPlug aus. Wenn in Schritt 2103 die Methode keinen Beschreibereintrag auswählt, dann gibt die Methode eine Fehlermeldung aus. In Schritt 2104 erstellt die Methode einen Verbinder aus dem ausgewählten Verbindereintrag. Dieser Verbinder wird verwendet, um das Kind zu verbinden. In Schritt 2105 ruft die Methode die Schnittstelle IClassFactory für das Kind wie durch die erhaltene Klassen-ID angegeben ab. In Schritt 2106 erstellt die Methode eine Instanz des Kindes und ruft dessen Schnittstelle IComponent ab. Die Methoden der Schnittstelle IComponent werden weiter unten beschrieben. In Schritt 2107 setzt die Methode die Kindkomponente, damit diese auf ihre Elternkomponente zeigt, indem sie die Methode SetParentComponent des Kindes setzt. In Schritt 2108 setzt die Methode den Eltern-Moniker des Kindes, indem sie die Methode SetParentMoniker des Kindes aufruft. In Schritt 2109 erstellt die Methode einen Komponenten-Moniker für das Kind. Der Komponenten-Moniker enthält eine Verbindungs-ID des erstellten Verbinders des Elters, um das Kind in dem Elter eindeutig zu identifizieren. In Schritt 2110 setzt die Methode den This-Moniker des Kindes, indem sie die Methode SetChild- Moniker des Kindes aufruft. In Schritt 2111 gibt die Methode den erstellten Komponenten- Moniker frei. In Schritt 2112 erstellt die Methode einen Verbinder aus dem Beschreibereintrag für das IComponentJack/IComponentPlug-Protokoll des Kindes. In Schritt 2113 ruft die Methode die Funktion ComponentConnect auf, um den Steckerverbinder des Elter mit dem Buchsenverbinder des Kindes zu verbinden. In Schritt 2114 gibt die Methode den Buchsenverbinder des Kindes frei und schließt ab.
- Die Funktion ComponentProjectDescriptor projiziert eine spezifizierte Schnittstelle einer spezifizierten Kindkomponente auf dessen Elternkomponente. Die Funktion erstellt einen "Projektions"-Beschreibereintrag für den Elter und verknüpft diesen in der DE-Liste. Der entsprechende Beschreibereintrag für das Kind wird gesetzt, um anzugeben, daß er projiziert ist. Der Projektions-Beschreibereintrag wird auf den spezifizierten Instanzennamen gesetzt. Ein bevorzugter Prototyp für die Funktion ComponentProjectDescriptor ist
- Der Parameter pComponentManager zeigt auf die Elternkomponente; der Parameter pChild-IComponentPlug zeigt auf die Schnittstelle IComponentPlug, die durch den Elter vorgesehen wird; die Parameter riid und child iname spezifizieren die Schnittstellen-ID und den Instanzennamen des zu projizierenden Kindverbinders; der Parameter my_name spezifiziert den Instanzennamen für den Projektions-Beschreibereintrag; und der Parameter cMaxConnectors spezifiziert die Maximalanzahl der Verbinder für den Projektions-Beschreibereintrag.
- Fig. 22 ist ein Flußdiagramm der Funktion ComponentProjectDescriptor. In Schritt 2201 ruft die Methode die Schnittstelle IConnector des Kindverbinders ab. In Schritt 2202 gibt die Methode die Schnittstelle frei. In Schritt 2203 wählt die Methode einen Beschreibereintrag des Kindes mit der erhaltenen Schnittstellen-ID und dem Instanzennamen aus. Wenn in Schritt 2204 die Methode keinen Beschreibereintrag auswählt, dann gibt die Methode eine Fehlermeldung aus. In Schritt 2205 wählt die Methode einen Beschreibereintrag des Elters mit der erhaltenen Schnittstellen-ID und dem neuen Instanzennamen aus. Wenn in Schritt 2206 die Methode einen Beschreibereintrag ausgewählt hat, dann gibt die Methode eine Fehlermeldung aus. In Schritt 2207 erstellt die Methode einen Projektions-Verbindereintrag für den Elter. In Schritt 2208 registriert die Methode die Projektion im Kind, um für das Kind anzugeben, daß sein Beschreibereintrag jetzt projiziert ist. Die Methode ruft die Methode Re gisterProjection der Schnittstelle IComponent des Kindes auf. In Schritt 2209 verknüpft die Methode den Projektions-Beschreibereintrag mit der DE-Liste des Elters und schließt ab.
- Ein Verbinder wird aus einem Projektions-Beschreibereintrag in analoger Weise wie aus einem nicht-Projektions-Beschreibereintrag erstellt. Der Elter benachrichtigt jedoch das Kind darüber, daß ein Verbinder erstellt wird und daß ein Zeiger auf die Schnittstelle IConnector des Kindes ausgegeben wird. Der Elter ruft die Methode NewProjectedConnector der Schnittstelle IComponent des Kindes auf. Diese Methode erstellt einen Verbinder für den projizierten Beschreibereintrag des Kindes. Wenn der projizierte Beschreibereintrag selbst ein Projektions-Beschreibereintrag ist, dann wird das Kind des Kindes benachrichtigt. CODETABELLE 7
- Die Codetabelle 7 definiert die Schnittstelle IComponent, die durch den Komponentenmanager vorgesehen wird. Die Schnittstelle IComponent sieht Methoden vor, um Komponenten zu manipulieren. Die Codetabelle 8 definiert die Internzustandsinformation des Komponentenmanagers. Im folgenden werden die Methoden der Schnittstelle IComponent beschrieben. CODETABELLE 8
- Fig. 23 ist ein Flußdiagramm der Methode SetMoniker der Schnittstelle IComponent. Die Methode SetMoniker erhält einen Zeiger auf einen Moniker und setzt den Vollpfad-Moniker (pmkr) dieser Dokumente, daß dieser auf den erhaltenen Moniker zeigt. Wenn in Schritt 2301 diese Komponente eine Kindkomponente ist, dann gibt die Methode eine Fehlermeldung aus, ansonsten fährt die Methode mit Schritt 2302 fort. Wenn in Schritt 2302 diese Komponente bereits einen Vollpfad-Moniker hat (pmkr! = NULL), dann gibt die Methode eine Fehlermeldung aus, ansonsten fährt die Methode mit Schritt 2303 fort. In Schritt 2303 setzt die Methode den Vollpfad-Moniker (pmkr) dieser Komponente auf den erhaltenen Moniker. In Schritt 2304 inkrementiert die Methode die Referenzzählung des erhaltenen Monikers und schließt ab.
- Fig. 24 ist ein Flußdiagramm der Methode GetMoniker der Klasse ComponentManager. Die Methode GetMoniker gibt einen Zeiger auf den Vollpfad-Moniker für diese Komponente aus. Wenn in Schritt 2401 diese Komponente keinen Vollpfad-Moniker aufweist, dann gibt die Methode eine Fehlermeldung aus. In Schritt 2402 inkrementiert die Methode die Referenzzählung des Vollpfad-Monikers und schließt ab.
- Fig. 24 ist ein Flußdiagramm der Methode SetParentMoniker der Klasse ComponentManager. Diese Methode setzt den Eltern-Moniker für diese Komponente auf den erhaltenen Moniker. Wenn die Komponente gegenwärtig einen Eltern-Moniker hat, dann gibt die Methode den aktuellen Eltern-Moniker frei. Die Methode setzt auch den Eltern-Moniker aller Kindkomponenten. Wenn in Schritt 2501 diese Komponente einen Elternmoniker hat (pmkParent), dann gibt die Methode den Elternmoniker in Schritt 2502 frei. Wenn in Schritt 2503 die Komponente einen Volllpfad-Moniker (pmkr) aufweist, dann gibt die Methode den Vollpfad- Moniker in Schritt 2504 frei. In Schritt 2505 setzt die Methode den Eltern-Moniker dieser Komponente auf den erhaltenen Moniker. In Schritt 2506 inkrementiert die Methode die Referenzzählung des erhaltenen Monikers. Wenn in Schritt 2507 die Komponente keinen This- Moniker aufweist (pmkThis), dann schließt die Methode ab. In Schritt 2508 setzt die Methode den Vollpfad-Moniker auf die Verbindung aus dem Eltern-Moniker und dem This-Moniker, indem sie die Methode ComposeWith des Eltern-Monikers aufruft. In Schritt 2509 ruft die Methode die Methode Rename auf, um den Eltern-Moniker jeder Kindkomponente zu setzen, und schließt dann ab.
- Fig. 26 ist ein Flußdiagramm der privaten Methode Rename der Schnittstelle IComponent. Die Methode setzt den Eltern-Moniker jeder Kindkomponente dieser Komponente auf den erhaltenen Moniker. Diese Methode trennt auch Verbinder. In Schritt 2601 wählt die Methode den Beschreibereintrag in der DE-Liste für den Verbinder zu den Kindkomponenten aus. Wenn in Schritt 2602 der Beschreibereintrag ausgewählt ist, dann kann diese Komponente Kindkomponenten aufweisen, und die Methode fährt in Schritt 2603 fort, ansonsten fährt die Methode in Schritt 2606 fort. In Schritt 2603 wählt die Methode den nächsten Verbindereintrag für den ausgewählten Beschreibereintrag, wobei sie mit dem ersten Verbindereintrag in der CE-Liste beginnt. Wenn in Schritt 2604 alle Verbindereinträge ausgewählt wurden, dann fährt die Methode in Schritt 2606 fort, ansonsten fährt die Methode in Schritt 2605 fort. In Schritt 2605 setzt die Methode den Eltern-Moniker der Kindkomponente, die mit dem ausgewählten Verbindereintrag verbunden ist, indem sie die Methode SetParentMoniker der Kindkomponente aufruft. Die Methode springt dann zu Schritt 2603 zurück, um den nächsten Verbindereintrag auszuwählen, in den Schritten 2606 bis 2611 durchläuft die Methode eine Schleife zum Trennen von Verbindern. In Schritt 2606 wählt die Methode den nächsten Beschreibereintrag in der DE-Liste, der keine Projektion ist. Wenn in Schritt 2607 alle Beschreibereinträge ausgewählt wurden, dann schließt die Methode ab. In Schritt 2608 wählt die Methode den nächsten Verbindereintrag in der CE-Liste für den ausgewählten Beschreibereintrag aus, der verbunden ist, wobei sie mit dem ersten Verbindereintrag beginnt. Wenn in Schritt 2609 alle Verbindereinträge ausgewählt wurden, dann springt die Methode zu Schritt 2606, um den nächsten Beschreibereintrag auszuwählen, ansonsten fährt die Methode mit Schritt 2610 fort. In Schritt 2610 gibt die Methode die Umkehrschnittstelle des ausgewählten Verbindereintrags frei und setzt die Umkehrschnittstelle auf NULL. In Schritt 2611 gibt die Methode den Umkehrschnittstellen-Moniker des ausgewählten Verbindereintrags frei, setzt den Zeiger zu dem Umkehrschnittstellen-Moniker auf NULL und springt zu Schritt 2608, um den nächsten Verbindereintrag auszuwählen.
- Fig. 27 ist ein Flußdiagramm der Methode SetChildMoniker der Schnittstelle IComponent. Die Methode SetChildMoniker setzt den This-Moniker auf den erhaltenen Moniker. Die Methode ruft weiterhin die Methode Rename der Komponente auf, um die Kindkomponenten umzubenennen. Wenn in Schritt 2701 diese Komponente einen This-Moniker aufweist, dann gibt die Methode eine Fehlermeldung aus, welche angibt, daß eine Komponente ihren This- Moniker nur einmal setzen kann. Wenn in Schritt 2702 diese Komponente einen Vollpfad- Moniker aufweist, dann ist diese Komponente keine Kindkomponente und die Methode gibt eine Fehlermeldung aus. Wenn in Schritt 2703 die Komponente keinen Eltern-Moniker aufweist, dann gibt die Methode eine Fehlermeldung aus, weil der Eltern-Moniker gesetzt hätte werden müssen, als diese Kindkomponente erstellt wurde. In Schritt 2704 setzt die Methode den This-Moniker (pmkThis) dieser Komponente auf den erhaltenen Moniker. In Schritt 2705 inkrementiert die Methode die Referenzzählung des erhaltenen Monikers. In Schritt 2706 setzt die Methode den Vollpfad-Moniker der Komponente auf die Verbindung aus dem Eltern-Moniker und dem This-Moniker, indem sie die Methode ComposeWithh des Eltern- Monikers aufruft. In Schritt 2707 ruft die Methode die Methode Rename dieser Komponente auf, um die Kindkomponenten umzubenennen, und schließt dann ab.
- Fig. 28 ist ein Flußdiagramm der Methode SetParentComponent der Schnittstelle IComponent. Die Methode SetParentComponent setzt den Elter (pParent) dieser Komponente, daß sie auf die erhaltene Komponente zeigt. Diese Methode erhöht die Referenzzählung des Elters nicht, um zirkuläre Referenzen zu vermeiden. Wenn in Schritt 2801 diese Komponente eine Elternkomponente aufweist oder die erhaltene Komponente NULL ist, dann gibt die Methode eine Fehlermeldung aus. In Schritt 2802 setzt die Methode den Elter dieser Komponente auf die erhaltene Komponente und schließt ab.
- Fig. 29 ist ein Flußdiagramm der Methode DoEagerBinds der Schnittstelle IComponent. Die Methode bindet die Stubs für alle Verbindereinträge, die keine Projektion sind, für welche ein Eager Binding spezifiziert ist und die nicht bereits verbunden sind. In Schritt 2901 wählt die Methode den nächsten Beschreibereintrag dieser Komponente aus, wobei sie mit dem ersten beginnt. Wenn in Schritt 2902 alle Beschreibereinträge bereits ausgewählt wurden, dann schließt die Methode ab, ansonsten fährt die Methode in Schritt 2903 fort. Wenn in Schrift 2903 der ausgewählte Beschreibereintrag keine Projektion ist, dann fährt die Methode in Schritt 2904 fort, ansonsten springt die Methode zu Schritt 2901, um den nächsten Beschreibereintrag auszuwählen. Wenn in Schritt 2904 der ausgewählte Beschreibereintrag ein Eager Binding angibt, dann fährt die Methode mit Schritt 2905 fort, ansonsten springt die Methode zu Schritt 2901, um den nächsten Beschreibereintrag auszuwählen. In Schritt 2905 wählt die Methode den nächsten Verbindereintrag für den ausgewählten Beschreibereintrag aus, wobei sie mit den ersten beginnt. Wenn in Schritt 2906 alle Verbindereinträge bereits ausgewählt wurden, dann springt die Methode zu Schritt 2901 zurück, um den nächsten Beschreibereintrag auszuwählen, ansonsten fährt die Methode mit Schritt 2907 fort. Wenn in Schritt 2907 der ausgewählte Verbindereintrag verbunden ist, dann springt die Methode zu Schritt 2905 zurück, um den nächsten Verbindereintrag auszuwählen, ansonsten fährt die Methode mit Schritt 2908 fort. In Schritt 2908 ruft die Methode die Methode BindStub der Schnittstelle IConnector des ausgewählten Verbindereintrags auf und springt zu Schritt 2905, um den nächsten Verbindereintrag auszuwählen.
- Die Codetabelle 2A enthält eine Definition des Komponentenbeschreibers. Im folgenden wird das Feld des Komponentenbeschreibers beschrieben.
- ComponentDescriptor::cConnectors
- Dieses Feld gibt die Anzahl der Verbinderbeschreiber in der Matrix der Verbinderbeschreiber an:
- ComponentDescriptor::pConnDesc
- Dieses Feld ist ein Zeiger auf die Verbinderbeschreibermatrix.
- ComponentDescriptor::Create
- Dieses Feld sieht einen Zeiger auf eine Funktion vor, die durch die Benutzerkomponente vorgesehen wird, die beim Erstellen der Komponente aufgerufen wird. Die Benutzerkomponente wird als aggregatfähig geschrieben; die an diese Funktion gegebene steuernde IUnknown wird durch den Komponentenmanager vorgesehen. Der Komponentenmanager nimmt die Benutzerkomponente in sich selbst auf. Die Benutzerkomponente erhält einen Zeiger auf den Komponentenmanager, der verwendet werden kann, um bestimmte Dienste zu erhalten. Die Benutzerkomponente sieht eine Implementierung der Schnittstelle IPersist vor. Wenn die Benutzerkomponente einen dauerhaften Zustand haben soll, dann sieht sie auch eine Implementierung der Schnittstelle IPersistStorage vor. Auf diese Weise kann der Komponentenmanager veranlassen, daß die Benutzerkomponente dauerhaft ist.
- Die Codetabelle 2B enthält eine Beschreibung eines Verbinderbeschreibers. Im folgenden wird das Feld des Verbinderbeschreibers beschrieben.
- ConnectorDescriptor::piid
- Die Schnittstellen-ID des Protokolls, das durch die Benutzerkomponente vorgesehen wird.
- ConnectorDescriptor::piidm
- Die Umkehrschnittstellen-ID des Protokolls.
- ConnectorDescriptor::iname
- Der Instanzenname des Protokolls. Dieser Name wird verwendet, um zwischen mehrfachen Implementierungen desselben Protokolls zu entscheiden, das durch eine Benutzerverbindung vorgesehen wird.
- ConnectorDescriptor::flag
- Spezifiziert eine bestimmte Steuerinformation über den Verbinder.
- CNNCTR_PLUG
- Dieses Flag gibt an, daß die Benutzerkomponente die Steckerschnittstelle des Protokolls implementiert.
- CNNCTR_JACK
- Dieses Flag gibt an, daß die Benutzerkomponente die Buchsenschnittstelle des Protokolls implementiert.
- CNNCTR_REVIOPT
- Dieses Flag gibt an, daß die Umkehrschnittstelle der Verbindung optional ist. Es kann verwendet werden, wenn eine derartige Schnittstelle nur Information bereitstellt oder die andere Komponente über bestimmte Ereignisse benachrichtigt, an denen die andere Komponente vielleicht nicht interessiert ist.
- CNNCTR_EAGERBIND
- Dieses Flag gibt an, daß der Verbinder mit der Umkehrschnittstelle verbunden werden soll, sobald eine Verbindung hergestellt wird, was als Eager Binding bezeichnet wird. Es überschreibt das standardmäßig vorgesehene Lazy Binding zu Schnittstellen.
- CNNCTR_REVIPTR
- Dieses Flag gibt an, daß die Komponente einen Umkehrschnittstellenzeiger enthält.
- CNNCTR_NONPERSISTENT
- Dieses Flag gibt an, daß der Verbinder nicht bleiben soll, wenn alle Referenzen auf ihn abgeschlossen sind. Derartige Verbinder werden gespeichert, wenn eine Komponente gespeichert wird. Diese Verbinder werden alleine dadurch aktiv gehalten, daß auf die Bezug genommen wird. Derartige Verbinder können bei Bedarf durch Clients einer Komponente erstellt werden, und es können Moniker auf dieselben erstellt werden. Typischerweise werden sie durch eine Dienstkomponente verwendet, welche niemals eine Verbindung in einem bidirektionalen Protokoll initiiert oder welche die Implementierung in einem unidirektionalen Protokoll vorsieht.
- CNNCTR_PRIVATE
- Dieses Flag gibt an, daß das Protokoll nicht außerhalb der Komponente projiziert oder erstellt werden soll, ist aber nur für die Verbindung von der Komponente zu einer Kindkomponente verfügbar. Ein derartiger Verbinder wird nicht in Beschreiberaufzählern oder Verbinderaufzählern aufgelistet, die außerhalb der Komponente erstellt werden, wird aber von diesen gesehen, wenn sie innerhalb der Komponente erstellt werden.
- CNNCTR_AGGREGATE
- Dieses Flag veranlaßt den Komponentenmanager, die Schnittstelle dieses Verbinders in den Komponentenmanager aufzunehmen und nicht anzunehmen, daß die einzige Schnittstelle in diesem Verbinder die in dem Verbinderbeschreiber angegebene ist. Wenn eine andere Schnittstelle als die durch piid spezifizierte angefordert wird, ruft der Komponentenmanager IUnknown der Umkehrschnittstelle auf.
- ConnectorDescriptor::cMaxConnectors
- Dieses Feld spezifiziert ein Anfangslimit für die Anzahl von Instanzen dieses Verbinders, die gleichzeitig von der Komponente erstellt werden können. Die Komponente kann diesen Wert in Laufzeit ändern. Der eingestellte Wert ist für folgende Aktivierungen der Komponente dauerhaft, wobei der hier spezifizierte Wert nur der Defaultwert für eine neu erstellte Instanz der Komponente ist. Der Wert ULONG MAX spezifiziert, daß kein Limit für die Anzahl der Instanzen besteht, die erstellt werden können.
- ConnectorDescriptor::RevlfacePtrOff
- Dieses Feld enthält den Offset in der Benutzerkomponente (von der Schnittstelle) des Umkehrschnittstellenzeigers.
- ConnectorDescriptor::OutStubf
- Diese Felder enthalten Zeiger zu Stub-Klassenfabriken für das bestimmte Protokoll.
- ConnectorDescriptor::Create
- Dieses Feld enthält einen Zeiger auf eine Funktion in der Benutzerkomponente, die einen Zeiger auf die Schnittstelle ausgibt. Diese Funktion wird aufgerufen, wenn ein Verbinder erstellt wird. Die Funktion gibt einen Zeiger auf die Schnittstelle aus.
- ConnectorDescriptor::Delete
- Dieses Feld enthält einen Zeiger auf eine Funktion, die durch die Benutzerkomponente vorgesehen wird und aufgerufen wird, wenn ein Verbinder gelöscht werden soll.
- ConnectorDescriptor::Connect
- Dieses Feld enthält einen Zeiger auf eine Funktion, die durch die Benutzerkomponente vorgesehen wird und aufgerufen wird, wenn eine Verbindung hergestellt wird. Dies stellt eine Gelegenheit für die Benutzerkomponente dar, um eine Initialisierung durchzuführen. Zuerst wird das Steckerende einer Verbindung benachrichtigt und dann das Buchsenende. Protokolle sind typischerweise derart ausgebildet, daß das Steckerende während der Benachrichtigung über die Verbindung möglicherweise einige Steueraufrufe ausgeben möchte. Die Benachrichtigung erfolgt, nachdem die Verbindung hergestellt wurde, wobei die Schnittstellen dann für die Verwendung bereit sind.
- ConnectorDescriptor::Disconnect
- Dieses Feld enthält einen Zeiger auf eine Funktion, die durch die Benutzerkomponente vorgesehen wird und aufgerufen wird, wenn eine Verbindung getrennt wird. Dies stellt eine Gelegenheit zum Durchführen eines erforderlichen Aufräumens dar. Zuerst wird das Steckerende und dann das Buchsenende benachrichtigt. Nachdem beide Enden über die Verbindungstrennung benachrichtigt wurden, wird die tatsächliche Trennung der Verbindung vorgenommen.
- ConnectorDescriptor::Load und ConnectorDescriptor::Save
- Diese Felder enthalten Zeiger auf Funktionen, die durch die Benutzerkomponente vorgesehen werden und aufgerufen werden, um information zu laden und zu speichern. Eine Benutzerkomponente kann mit einer Verbindung assoziierte Zustandsinformation für mehrere Aktivierungen der Komponente speichern.
- Fig. 30 ist ein Blockdiagramm, das ein beispielhaftes System zeigt, welches die vorliegende Erfindung verwendet. Der Computer 3001 ist mit der Anzeigeeinrichtung 3002, einer Eingabeeinrichtung 3003 und einem nichtflüchtigen Speicher 3004 verbunden. Der Computer 3001 umfaßt eine zentrale Verarbeitungseinheit 3008, einen visuellen Programmiermanager 3005, verfügbare Komponenten 3006 und ausgewählte Komponenten 3007. Der visuelle Programmiermanager verwaltet die Erstellung von visuellen Programmen. Der visuelle Programmiermanager zeigt eine Liste mit verfügbaren Komponenten auf der Anzeigeeinrichtung an. Ein Programmierer wählt unter Verwendung der Eingabeeinrichtung aus, welche Komponenten in einem Programm enthalten sein sollen. Der visuelle Programmiermanager erstellt eine Instanz von jeder ausgewählten Komponente. Nachdem die Komponenten ausgewählt wurden, spezifiziert der Programmierer, wie die Komponenten miteinander verbunden sein sollen. Jede Komponente sieht eine Liste mit den von ihr unterstützten Protokollen vor. Der visuelle Programmiermanager zeigt die Listen auf der Anzeigeeinrichtung an. Der Programmierer spezifiziert zwei Komponenten für die Verbindung über das Protokoll. Der visuelle Programmiermanager veranlaßt, daß die spezifizierten Komponenten Verbinder für das Protokoll erstellen. Der visuelle Programmiermanager veranlaßt dann, daß die erstellten Verbinder verbunden werden.
- Fig. 31 ist ein Diagramm, das die Anzeige eines beispielhaften visuellen Programms darstellt. Das visuelle Programm zeigt eine Bildlaufleiste 3101 und ein Anzeigefeld 3102 an. Das Anzeigefeld zeigt einen Zahlenwert zwischen 0 und 100 an, welcher der Position der Positionsanzeige in der Bildlaufleiste entspricht. Wenn die Positionsanzeige durch einen Benutzer bewegt wird, dann wird der Wert in dem Anzeigefeld automatisch aktualisiert. Wenn umgekehrt ein neuer Wert durch einen Benutzer in das Anzeigefeld eingegeben wird, dann wird die Positionsanzeige dementsprechend automatisch verschoben. Um das visuelle Programm zu erstellen, wählt ein Programmierer eine Bildlaufleistenkomponente und eine Anzeigefeldkomponente aus und verbindet dann die Komponenten.
- Fig. 32 ist ein Blockdiagramm, das die als Instanzen erstellten Komponenten zeigt. Die Bildlaufleistenkomponente 3201 ist mit als mit einer Buchse 3202 erstellt gezeigt. Die Anzeigefeldkomponente 3203 ist als mit einem Stecker 3204 erstellt gezeigt. Die Buchse 3202 und der Stecker 3204 werden miteinander verbunden. Im Betrieb sieht die Bildlaufleistenkomponente die Anzeige der Bildlaufleiste 3101 vor, während die Anzeigefeldkomponente 3203 die Anzeige des Anzeigefelds 3102 vorsieht. Wenn die Positionsanzeige bewegt wird, sendet das Betriebssystem eine Nachricht an die Bildlaufleistenkomponente. In Reaktion auf die Nachricht, nimmt die Bildlaufleistenkomponente ein Sammelsenden der Nachricht über ihre erstellte Buchse vor. Die Anzeigefeldkomponente empfängt die Nachricht und ändert das Anzeigefeld dementsprechend. Wenn ein Benutzer einen neuen Wert in das Anzeigefeld eingibt, sendet das Betriebssystem entsprechend eine Nachricht an die Anzeigefeldkomponente. In Reaktion darauf, nimmt die Anzeigefeldkomponente ein Sammelsenden zu den Buchsen vor, die über das Protokoll verbunden sind. Die Bildlaufleistenkomponente empfängt die Nachricht und ändert die Positionsanzeige dementsprechend.
Claims (16)
1. Verfahren in einem Computersystem zum Verbinden von zwei Komponenten, wobei
das Verfahren folgende Schritte umfaßt:
Erstellen einer ersten Komponente mit einer ersten Komponentenschnittstelle,
Erstellen einer zweiten Komponente,
Erstellen eines ersten Verbinderobjekts mit einem Zeiger auf die erste
Komponentenschnittstelle,
Erstellen eines zweiten Verbinderobjekts mit einer Referenz auf eine Position in der
zweiten Komponente, und
Verbinden der ersten Komponente mit der zweiten Komponente durch das Angeben
des ersten Verbinderobjekts und des zweiten Verbinderobjekts, indem der Zeiger auf die
erste Komponentenschnittstelle aus dem ersten Verbinderobjekt abgerufen wird, indem die
Referenz auf die Position in der zweiten Komponente aus dem zweiten Verbinderobjekt
abgerufen wird und indem der abgerufene Zeiger an der durch die abgerufene Referenz
angegebenen Position gespeichert wird,
wobei die zweite Komponente über den an der angegebenen Position gespeicherten
Zeiger auf Dienste der ersten Komponentenschnittstelle zugreifen kann.
2. Verfahren nach Anspruch 1, wobei der Schritt zum Erstellen einer ersten
Komponente das Verbinden einer ersten Instanz eines Komponentenmanagers mit einer ersten
Benutzerkomponente umfaßt, wobei der Komponentenmanager zum Verwalten der
Verbindung der Komponenten dient und wobei die erste Benutzerkomponente die erste
Komponentenschnittstelle aufweist,
wobei der Schritt zum Erstellen einer zweiten Komponente das Verbinden einer
zweiten Instanz des Komponentenmanagers mit einer zweiten Benutzerkomponente umfaßt,
wobei der Schritt zum Erstellen eines ersten Verbinderobjekts unter der Steuerung
der ersten Instanz des Komponentenmanagers durchgeführt wird, und
wobei der Schritt zum Erstellen eines zweiten Verbinderobjekts unter der Steuerung
der zweiten Instanz des Komponentenmanagers durchgeführt wird.
3. Verfahren nach Anspruch 2, wobei die zweite Benutzerkomponente eine zweite
Komponentenschnittstelle aufweist und das zweite Verbinderobjekt einen Zeiger auf die
zweite Komponentenschnittstelle aufweist, wobei das erste Verbinderobjekt eine Referenz
auf eine Position in der ersten Benutzerkomponente aufweist und wobei der
Verbindungsschritt das Herstellen einer Verbindung umfaßt, indem die Referenz auf die Position in der
ersten Benutzerkomponente aus dem ersten Verbinderobjekt abgerufen wird, indem der
Zeiger auf die zweite Komponentenschnittstelle aus dem ersten Verbinderobjekt abgerufen
wird und indem der abgerufene Zeiger an der durch die abgerufene Referenz angegebenen
Position gespeichert wird,
wobei die erste Benutzerkomponente über den an der angegebenen Position
gespeicherten Zeiger auf Dienste der zweiten Komponentenschnittstelle zugreifen kann.
4. Verfahren nach Anspruch 3, wobei das erste Verbinderobjekt eine Identifikation der
ersten Komponentenschnittstelle umfaßt, das zweite Verbinderobjekt eine Identifikation der
zweiten Komponentenschnittstelle umfaßt und im Verbindungsschritt bestimmt wird, ob die
Identifikation der ersten Komponentenschnittstelle mit der Identifikation der zweiten
Komponentenschnittstelle kompatibel ist.
5. Verfahren nach Anspruch 4, wobei der Schritt zum Erstellen eines ersten
Verbinderobjekts einen Schritt zum Aufrufen einer Rückmeldungsroutine der ersten
Benutzerkomponente umfaßt, um die erste Benutzerkomponente über das Erstellen des ersten
Verbinderobjekts zu benachrichtigen.
6. Verfahren nach Anspruch 2, wobei der Schritt zum Verbinden der ersten Komponente
mit der zweiten Komponente weiterhin folgende Schritte umfaßt:
Anfordern, daß das erste Verbinderobjekt eine Verbindung mit dem zweiten
Verbinderobjekt herstellt,
nach dem Anfordern der Verbindung des ersten Verbinderobjekts mit dem zweiten
Verbinderobjekt, Anfordern, daß das zweite Verbinderobjekt eine Verbindung mit dem ersten
Verbinderobjekt herstellt und die zweite Benutzerkomponente über die Verbindung
benachrichtigt, und
nach dem Anfordern der Verbindung des zweiten Verbinderobjekts mit dem ersten
Verbinderobjekt, Anfordern, daß das erste Verbinderobjekt die erste Benutzerkomponente
über die Verbindung benachrichtigt.
7. Verfahren nach Anspruch 1, wobei der Schritt zum Erstellen einer ersten
Komponente die erste Komponente als eine Kombination aus einer ersten Instanz eines
Komponentenmanagers und einer ersten Benutzerkomponente erstellt, wobei der
Komponentenmanager zum Verwalten der Verbindung der Komponenten dient und die erste
Benutzerkomponente die erste Komponentenschnittstelle aufweist,
wobei der Schritt zum Erstellen einer zweiten Komponente die zweite Komponente
als eine Kombination aus einer zweiten Instanz des Komponentenmanagers mit einer
zweiten Benutzerkomponente erstellt,
wobei der Schritt zum Erstellen eines ersten Verbinderobjekts unter der Steuerung
der ersten Instanz des Komponentenmanagers durchgeführt wird, und
wobei der Schritt zum Erstellen des zweiten Verbinderobjekts unter der Steuerung
der zweiten Instanz des Komponentenmanagers durchgeführt wird.
8. Computersystem zum Verbinden von zwei Komponenten, wobei das
Computersystem umfaßt:
eine Einrichtung zum Erstellen einer Serverkomponente mit einer
Serverkomponentenschnittstelle,
eine Einrichtung zum Erstellen einer Clientkomponente mit einer Position zum
Speichern eines Zeigers auf eine Schnittstelle einer Komponente, mit welcher die
Clientkomponente verbunden ist,
eine Einrichtung zum Erzeugen eines Zeigers auf die
Serverkomponentenschnittstelle,
eine Einrichtung zum Erzeugen einer Referenz auf die Position in der
Clientkomponente, und
eine Einrichtung zum Verbinden der Serverkomponente mit der Clientkomponente,
indem der Zeiger auf die Serverkomponentenschnittstelle und die Referenz auf die Position
in der Clientkomponente spezifiziert werden und der Zeiger an der angegebenen Position
gespeichert wird,
wobei die Clientkomponente über den an der angegebenen Position gespeicherten
Zeiger auf die Dienste der Serverkomponentenschnittstelle zugreifen kann.
9. Computersystem nach Anspruch 8 zum Benachrichtigen einer Vielzahl von mit der
Serverkomponente verbundenen Clientkomponenten, welche jeweils eine
Clientkomponentenschnittstelle mit einem Funktionsglied aufweisen, wobei die Serverkomponente einen
Serverkomponentenmanager und eine Serverbenutzerkomponente aufweist, wobei der
Serverkomponentenmanager dazu dient, die Clientkomponenten mit der Serverkomponente zu
verbinden, wobei der Serverkomponentenmanager eine Referenz auf die
Clientkomponentenschnittstelle jeder verbundenen Clientkomponente aufweist, mit:
einer Einrichtung, um unter der Steuerung des Serverkomponentenmanagers ein
Sammelsende-Objekt zu erstellen, welches eine Implementierung des Funktionsgliedes der
Clientkomponentenschnittstelle aufweist,
einer Einrichtung, um unter der Steuerung der Serverbenutzerkomponente das
Funktionsglied der Clientkomponentenschnittstelle des Sammelsende-Objektes aufzurufen, und
einer Einrichtung, um unter der Steuerung des aufgerufenen Funktionsgliedes der
Clientkomponentenschnittstelle des Sammelsende-Objektes
die Referenz auf die Clientkomponentenschnittstelle für jede der Clientkomponenten
abzurufen, und
das Funktionsglied der Clientkomponentenschnittstelle aufzurufen, das durch die
abgerufenen Referenzen angegeben wird.
10. Computersystem nach Anspruch 8 zum Senden einer Nachricht zu einer Vielzahl von
Clientkomponenten, die mit der Serverkomponente verbunden sind, wobei jede
Clientkomponente eine Clientkomponentenschnittstelle aufweist, wobei die
Clientkomponentenschnittstelle ein Funktionsglied aufweist und wobei die Serverkomponente eine Referenz auf die
Clientkomponentenschnittstelle jeder Clientkomponente aufweist, mit:
einer Einrichtung zum Erstellen eines Sammelsende-Objekts mit einer
Implementierung des Funktionsgliedes der Clientkomponentenschnittstelle,
einer Einrichtung zum Aufrufen des Funktionsgliedes der
Clientkomponentenschnittstelle des Sammelsende-Objekts, und
einer Einrichtung, um unter der Steuerung des aufgerufenen Funktionsgliedes der
Clientkomponentenschnittstelle des Sammelsende-Objektes
die Referenz auf die Clientkomponentenschnittstelle der Clientkomponente für jede
der Clientkomponenten abzurufen, und
das Funktionsglied der Clientkomponentenschnittstelle aufzurufen, das durch die
abgerufenen Referenzen angegeben wird.
11. Computersystem nach Anspruch 10, wobei die Serverkomponente einen
Serverkomponentenmanager und eine Serverbenutzerkomponente aufweist und eine Einrichtung
umfaßt, um unter der Steuerung der Serverbenutzerkomponente den
Serverkomponentenmanager zum Erstellen des Sammelsende-Objektes aufzufordern, wobei das Erstellen durch
den Serverkomponentenmanger durchgeführt wird und wobei das Aufrufen des
Funktionsglieds der Clientkomponentenschnittstelle des Sammelsende-Objekts durch die
Serverbenutzerkomponente durchgeführt wird.
12. Computersystem nach Anspruch 11, wobei die Clientkomponentenschnittstelle eine
Vielzahl von Funktionsgliedern umfaßt und wobei weiterhin eine Einrichtung zum Auswählen
eines Funktionsgliedes der Clientkomponentenschnittstelle vorgesehen ist, um darüber die
Nachricht an die Clientkomponente zu senden, so daß das Aufrufen des Funktionsgliedes
der Clientkomponentenschnittstelle das ausgewählte Funktionsglied aufruft.
13. Computersystem nach Anspruch 10, welches eine Einrichtung zum Erstellen eines
Verbinderobjekts für jede Clientkomponente und zum Speichern der Referenz auf die
Clientkomponentenschnittstelle in den erstellten Verbinderobjekten umfaßt.
14. Computersystem nach Anspruch 8 zum verzögerten Binden der
Serverkomponentenschnittstelle, wobei die Serverkomponentenschnittstelle ein Funktionsglied aufweist, mit:
einer Einrichtung zum Erstellen eines verzögerten Bindungsobjekts, das eine
Implementierung des Funktionsglieds der Serverkomponentenschnittstelle aufweist,
einer Einrichtung zum Speichern einer Referenz auf das verzögerte Bindungsobjekt,
einer Einrichtung, um wenn die Clientkomponente das Funktionsglied der
Server-
komponentenschnittstelle der Serverkomponente aufrufen soll
die gespeicherte Referenz abzurufen
wenn die abgerufene Referenz auf das verzögerte Bindungsobjekt verweist,
das Funktionsglied der Serverkomponentenschnittstelle des
verzögerten Bindungsobjekts aufzurufen, und
unter der Steuerung des aufgerufenen Funktionsglieds des
verzögerten Bindungsobjekts
die Serverkomponentenschnittstelle der Serverkomponente zu
binden, um eine Referenz auf die
Serverkomponentenschnittstelle der Serverkomponente zu erzeugen, die gespeicherte
Referenz auf das verzögerte Bindungsobjekts durch die erzeugte
Referenz auf die Serverkomponentenschnittstelle der
Serverkomponente zu ersetzen, und
das Funktionsglied der Serverkomponentenschnittstelle der
Serverkomponente aufzurufen, und
einer Einrichtung zum Aufrufen des Funktionsglieds der
Serverkomponentenschnittstelle der Serverkomponente, wenn die abgerufene Referenz auf die
Serverkomponentenschnittstelle der Serverkomponente verweist,
wobei die Bindung zu der Serverkomponentenschnittstelle der Serverkomponente
verzögert wird, bis ein Funktionsglied der Serverkomponentenschnittstelle der
Serverkomponente durch die Clientkomponente aufzurufen ist.
15. Computersystem nach Anspruch 14, wobei die Clientkomponente einen
Clientkomponentenmanager und eine Clientbenutzerkomponente umfaßt, wobei der
Clientkomponentenmanager eine Einrichtung zum Erstellen des verzögerten Bindungsobjekts und zum
Weitergeben der Referenz auf das verzögerte Bindungsobjekt an die Clientbenutzerkomponente
umfaßt und wobei die Clientbenutzerkomponente eine Einrichtung zum Speichern der
erhaltenen Referenz, zum Abrufen der gespeicherten Referenz und zum Aufrufen des
Funktionsglieds der Schnittstelle umfaßt, auf welche durch die abgerufene Referenz verwiesen wird.
16. Computersystem nach Anspruch 8 zum verzögerten Binden der
Serverkomponentenschnittstelle der Serverkomponente, wobei die Serverkomponentenschnittstelle ein
Funktionsglied aufweist, mit:
einer Einrichtung zum Erstellen eines verzögerten Bindungsobjekts, das eine
Implementierung des Funktionsglieds der Serverkomponentenschnittstelle aufweist, wobei die
Implementierung des Funktionsglieds für die Bindung mit der Serverkomponentenschnittstelle
der Serverkomponente dazu dient, eine Referenz auf die Serverkomponentenschnittstelle
der Serverkomponente zu erzeugen, eine Referenz auf die Serverkomponentenschnittstelle
des verzögerten Bindungsobjekts durch die Referenz auf die
Serverkomponentenschnittstelle der Serverkomponente zu ersetzen und die erzeugte Referenz zu verwenden, um das
Funktionsglied der Serverkomponentenschnittstelle der Serverkomponente aufzurufen,
einer Einrichtung zum Speichern der Referenz auf die
Serverkomponentenschnittstelle des erzeugten verzögerten Bindungsobjekts, und
einer Einrichtung zum Abrufen der gespeicherten Referenz beim Aufrufen des
Funktionsglieds der Serverkomponentenschnittstelle der Serverkomponente, wobei
wenn die abgerufene Referenz auf die Serverkomponentenschnittstelle des
verzögerten Bindungsobjekts verweist, das Funktionsglied der Serverkomponentenschnittstelle des
verzögerten Bindungsobjekts zum Binden der Serverkomponentenschnittstelle der
Serverkomponente aufgerufen wird, um die Referenz auf die Serverkomponentenschnittstelle der
Serverkomponente zu erzeugen, die Referenz auf die Serverkomponentenschnittstelle des
verzögerten Bindungsobjekts durch die Referenz auf die Serverkomponentenschnittstelle der
Serverkomponente zu ersetzen und um die erzeugte Referenz zu verwenden, um das
Funktionsglied der Serverkomponentenschnittstelle der Serverkomponente aufzurufen, und
wenn die abgerufene Referenz auf die Serverkomponentenschnittstelle der
Serverkomponente verweist, das Funktionsglied der Serverkomponentenschnittstelle der
Serverkomponente aufgerufen wird.
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US08/147,683 US5517645A (en) | 1993-11-05 | 1993-11-05 | Method and system for interfacing components via aggregate components formed by aggregating the components each with an instance of a component manager |
Publications (2)
Publication Number | Publication Date |
---|---|
DE69424744D1 DE69424744D1 (de) | 2000-07-06 |
DE69424744T2 true DE69424744T2 (de) | 2000-09-21 |
Family
ID=22522490
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
DE69424744T Expired - Lifetime DE69424744T2 (de) | 1993-11-05 | 1994-11-04 | Verfahren und System zur Verwaltung von Komponentenverbindungen |
Country Status (5)
Country | Link |
---|---|
US (2) | US5517645A (de) |
EP (1) | EP0652512B1 (de) |
JP (2) | JP3429873B2 (de) |
CA (1) | CA2134616C (de) |
DE (1) | DE69424744T2 (de) |
Families Citing this family (112)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0669020B1 (de) * | 1992-11-13 | 1997-04-02 | Microsoft Corporation | Verfahren zur verteilung von schnittstellenzeigern fur fernprozeduranrufe |
US5517645A (en) * | 1993-11-05 | 1996-05-14 | Microsoft Corporation | Method and system for interfacing components via aggregate components formed by aggregating the components each with an instance of a component manager |
US5742848A (en) * | 1993-11-16 | 1998-04-21 | Microsoft Corp. | System for passing messages between source object and target object utilizing generic code in source object to invoke any member function of target object by executing the same instructions |
US5485617A (en) | 1993-12-13 | 1996-01-16 | Microsoft Corporation | Method and system for dynamically generating object connections |
US6813769B1 (en) | 1997-10-28 | 2004-11-02 | Microsoft Corporation | Server application components with control over state duration |
US5922054A (en) * | 1994-08-19 | 1999-07-13 | Canon Kabushiki Kaisha | System for managing external applications and files |
EP0702291B1 (de) * | 1994-09-19 | 2002-04-03 | Sun Microsystems, Inc. | Verfahren und Einrichtung für das Aufrufen von Objekten mit Schnittstellenvererbung |
CA2172823C (en) * | 1994-09-21 | 2008-03-11 | John M. Pratt | A link manager for managing links integrating data between application programs |
US6249822B1 (en) | 1995-04-24 | 2001-06-19 | Microsoft Corporation | Remote procedure call method |
US5740455A (en) * | 1995-05-16 | 1998-04-14 | Apple Computer, Inc. | Enhanced compound document processing architectures and methods therefor |
US6385645B1 (en) * | 1995-08-04 | 2002-05-07 | Belle Gate Investments B.V. | Data exchange system comprising portable data processing units |
US5848273A (en) * | 1995-10-27 | 1998-12-08 | Unisys Corp. | Method for generating OLE automation and IDL interfaces from metadata information |
US8271339B2 (en) * | 1995-11-13 | 2012-09-18 | Lakshmi Arunachalam | Method and apparatus for enabling real-time bi-directional transactions on a network |
US8037158B2 (en) * | 1995-11-13 | 2011-10-11 | Lakshmi Arunachalam | Multimedia transactional services |
US7930340B2 (en) * | 1995-11-13 | 2011-04-19 | Lakshmi Arunachalam | Network transaction portal to control multi-service provider transactions |
US6339794B2 (en) * | 1995-12-08 | 2002-01-15 | Microsoft Corporation | Wire protocol for a media server system |
US6865610B2 (en) * | 1995-12-08 | 2005-03-08 | Microsoft Corporation | Wire protocol for a media server system |
WO1997022925A1 (en) * | 1995-12-15 | 1997-06-26 | Object Dynamics Corp. | Method and system for constructing software components and systems as assemblies of independent parts |
US5961588A (en) * | 1996-02-22 | 1999-10-05 | Alcatel Usa Sourcing, L.P. | Handling of commands passed between the server and client stations of a telecommunications system |
US5999986A (en) * | 1996-05-01 | 1999-12-07 | Microsoft Corporation | Method and system for providing an event system infrastructure |
EP0825506B1 (de) | 1996-08-20 | 2013-03-06 | Invensys Systems, Inc. | Verfahren und Gerät zur Fernprozesssteuerung |
EP0825524B1 (de) * | 1996-08-20 | 2000-01-19 | Alcatel | Verfahren zur Verwaltung der Benennung von Objekten |
US5812857A (en) * | 1996-08-28 | 1998-09-22 | Extended Systems, Inc. | Field configurable embedded computer system |
US5944829A (en) * | 1996-09-30 | 1999-08-31 | Intel Corporation | Adjusting software characteristics by user interface based upon battery level and the amount of time the user wants the battery to last |
US6757729B1 (en) * | 1996-10-07 | 2004-06-29 | International Business Machines Corporation | Virtual environment manager for network computers |
US5794256A (en) * | 1996-12-12 | 1998-08-11 | Microsoft Corporation | Pointer swizzling facility using three-state references to manage access to referenced objects |
US6038593A (en) * | 1996-12-30 | 2000-03-14 | Intel Corporation | Remote application control for low bandwidth application sharing |
GB2335520A (en) * | 1997-01-28 | 1999-09-22 | British Telecomm | Managing operation of servers in a distributed computing environment |
US5884078A (en) | 1997-01-31 | 1999-03-16 | Sun Microsystems, Inc. | System, method and article of manufacture for creating an object oriented component having multiple bidirectional ports for use in association with a java application or applet |
US6496870B1 (en) | 1997-01-31 | 2002-12-17 | Sun Microsystems, Inc. | System, method and article of manufacture for collaboration with an application |
US5913065A (en) * | 1997-01-31 | 1999-06-15 | Sun Microsystems, Inc. | System, method and article of manufacture for creating hierarchical folder components for use in a java application or applet |
US5842020A (en) * | 1997-01-31 | 1998-11-24 | Sun Microsystems, Inc. | System, method and article of manufacture for providing dynamic user editing of object oriented components used in an object oriented applet or application |
JPH10254689A (ja) * | 1997-03-14 | 1998-09-25 | Hitachi Ltd | クライアント・サーバシステムのアプリケーション構成設計支援方式 |
FR2762950B1 (fr) * | 1997-05-02 | 2000-08-04 | Alsthom Cge Alcatel | Procede de transmission d'une notification dans un reseau a applications distribuees comportant plusieurs services de notifications et reseau pour sa mise en oeuvre |
US6144992A (en) * | 1997-05-09 | 2000-11-07 | Altiris, Inc. | Method and system for client/server and peer-to-peer disk imaging |
US6125383A (en) * | 1997-06-11 | 2000-09-26 | Netgenics Corp. | Research system using multi-platform object oriented program language for providing objects at runtime for creating and manipulating biological or chemical data |
US6093215A (en) * | 1997-08-12 | 2000-07-25 | International Business Machines Corporation | Method and apparatus for building templates in a component system |
US6195794B1 (en) | 1997-08-12 | 2001-02-27 | International Business Machines Corporation | Method and apparatus for distributing templates in a component system |
US5978579A (en) * | 1997-08-12 | 1999-11-02 | International Business Machines Corporation | Architecture for customizable component system |
US6182279B1 (en) | 1997-08-12 | 2001-01-30 | International Business Machines Corporation | Method and apparatus for storing templates in a component system |
US5970252A (en) * | 1997-08-12 | 1999-10-19 | International Business Machines Corporation | Method and apparatus for loading components in a component system |
US6304894B1 (en) | 1997-09-22 | 2001-10-16 | Hitachi, Ltd. | Proxy server and recording medium storing a proxy server program |
EP0915419A3 (de) | 1997-10-06 | 2003-11-12 | Sun Microsystems, Inc. | Zugriff auf Fernobjekte |
US6317796B1 (en) * | 1997-10-06 | 2001-11-13 | Sun Microsystems, Inc. | Inline database for receiver types in object-oriented systems |
US6694506B1 (en) * | 1997-10-16 | 2004-02-17 | International Business Machines Corporation | Object oriented programming system with objects for dynamically connecting functioning programming objects with objects for general purpose operations |
US6151700A (en) * | 1997-10-20 | 2000-11-21 | International Business Machines Corporation | Object oriented distributed programming system for computer controlled networks with selective capture of program property data identifying a particular program version |
US5958004A (en) | 1997-10-28 | 1999-09-28 | Microsoft Corporation | Disabling and enabling transaction committal in transactional application components |
US6631425B1 (en) | 1997-10-28 | 2003-10-07 | Microsoft Corporation | Just-in-time activation and as-soon-as-possible deactivation or server application components |
US7076784B1 (en) | 1997-10-28 | 2006-07-11 | Microsoft Corporation | Software component execution management using context objects for tracking externally-defined intrinsic properties of executing software components within an execution environment |
US6134594A (en) | 1997-10-28 | 2000-10-17 | Microsoft Corporation | Multi-user, multiple tier distributed application architecture with single-user access control of middle tier objects |
US5963961A (en) * | 1997-11-25 | 1999-10-05 | International Business Machines Corporation | Database reconstruction using embedded database backup codes |
US6393472B1 (en) | 1997-12-10 | 2002-05-21 | At&T Corp. | Automatic aggregation of network management information in spatial, temporal and functional forms |
US6012067A (en) * | 1998-03-02 | 2000-01-04 | Sarkar; Shyam Sundar | Method and apparatus for storing and manipulating objects in a plurality of relational data managers on the web |
US7809138B2 (en) | 1999-03-16 | 2010-10-05 | Intertrust Technologies Corporation | Methods and apparatus for persistent control and protection of content |
US7233948B1 (en) * | 1998-03-16 | 2007-06-19 | Intertrust Technologies Corp. | Methods and apparatus for persistent control and protection of content |
US6279156B1 (en) * | 1999-01-26 | 2001-08-21 | Dell Usa, L.P. | Method of installing software on and/or testing a computer system |
US6023579A (en) * | 1998-04-16 | 2000-02-08 | Unisys Corp. | Computer-implemented method for generating distributed object interfaces from metadata |
US6795853B1 (en) | 1998-06-30 | 2004-09-21 | International Business Machines Corporation | Integration of additional computer components into a computer operation through attribute enabled interactive selections presented in composite lists available to the user in a variety of display screens |
US6526416B1 (en) | 1998-06-30 | 2003-02-25 | Microsoft Corporation | Compensating resource managers |
US6442620B1 (en) | 1998-08-17 | 2002-08-27 | Microsoft Corporation | Environment extensibility and automatic services for component applications using contexts, policies and activators |
US6425017B1 (en) | 1998-08-17 | 2002-07-23 | Microsoft Corporation | Queued method invocations on distributed component applications |
US6256780B1 (en) | 1998-09-10 | 2001-07-03 | Microsoft Corp. | Method and system for assembling software components |
US6564368B1 (en) * | 1998-10-01 | 2003-05-13 | Call Center Technology, Inc. | System and method for visual application development without programming |
US6574736B1 (en) | 1998-11-30 | 2003-06-03 | Microsoft Corporation | Composable roles |
US6487665B1 (en) | 1998-11-30 | 2002-11-26 | Microsoft Corporation | Object security boundaries |
US6385724B1 (en) | 1998-11-30 | 2002-05-07 | Microsoft Corporation | Automatic object caller chain with declarative impersonation and transitive trust |
US6397384B1 (en) * | 1998-12-18 | 2002-05-28 | Adobe Systems Incorporated | Run-time addition of interfaces |
US6748455B1 (en) | 1999-02-23 | 2004-06-08 | Microsoft Corporation | Object connectivity through loosely coupled publish and subscribe events with filtering |
US6829770B1 (en) | 1999-02-23 | 2004-12-07 | Microsoft Corporation | Object connectivity through loosely coupled publish and subscribe events |
FR2792435B1 (fr) * | 1999-04-15 | 2001-07-13 | Cit Alcatel | Procede de modification d'un protocole entre objets distribues |
US6453460B1 (en) * | 1999-04-26 | 2002-09-17 | Hewlett-Packard Company | Computer system with single processing environment for executing multiple application programs |
US7089530B1 (en) * | 1999-05-17 | 2006-08-08 | Invensys Systems, Inc. | Process control configuration system with connection validation and configuration |
WO2000070531A2 (en) | 1999-05-17 | 2000-11-23 | The Foxboro Company | Methods and apparatus for control configuration |
US6560770B1 (en) * | 1999-05-25 | 2003-05-06 | Oracle Corporation | Extending the attributes of an application generated using a fourth generation programming tool |
CN1278236C (zh) * | 1999-06-10 | 2006-10-04 | 贝勒加特投资公司 | 在分离的存储区域中存储数据组的不同版本的装置和更新存储器中数据组的方法 |
US6788980B1 (en) | 1999-06-11 | 2004-09-07 | Invensys Systems, Inc. | Methods and apparatus for control using control devices that provide a virtual machine environment and that communicate via an IP network |
US6564377B1 (en) | 1999-07-26 | 2003-05-13 | Microsoft Corporation | Self-describing components within a software catalog |
US6421682B1 (en) | 1999-07-26 | 2002-07-16 | Microsoft Corporation | Catalog management system architecture having data table objects and logic table objects |
US6377960B1 (en) | 1999-07-26 | 2002-04-23 | Microsoft Corporation | Transactional configuration store and runtime versus administration isolation with version snapshots and aging |
US6513112B1 (en) | 1999-07-26 | 2003-01-28 | Microsoft Corporation | System and apparatus for administration of configuration information using a catalog server object to describe and manage requested configuration information to be stored in a table object |
US6466943B1 (en) | 1999-07-26 | 2002-10-15 | Microsoft Corporation | Obtaining table objects using table dispensers |
US7337174B1 (en) | 1999-07-26 | 2008-02-26 | Microsoft Corporation | Logic table abstraction layer for accessing configuration information |
US6598037B1 (en) | 1999-07-26 | 2003-07-22 | Microsoft Corporation | Data table object interface for datastore |
EP1224544A1 (de) * | 1999-08-16 | 2002-07-24 | Z-Force Corporation | Voorrichtung für wiederverwendbare softwareteilen zur durchführung von gleichzeitlichkeit und hardwarezugang |
US6748555B1 (en) * | 1999-09-09 | 2004-06-08 | Microsoft Corporation | Object-based software management |
US6970903B1 (en) * | 1999-10-29 | 2005-11-29 | Intel Corporation | Distributed component system management using machine-independent activation requests |
DE69932643T2 (de) * | 1999-12-07 | 2007-04-05 | Sun Microsystems, Inc., Santa Clara | Identifizierungsvorrichtung mit gesichertem foto sowie mittel und verfahren zum authentifizieren dieser identifizierungsvorrichtung |
US6920636B1 (en) | 1999-12-15 | 2005-07-19 | Microsoft Corporation | Queued component interface passing for results outflow from queued method invocations |
US7389246B1 (en) | 2000-02-15 | 2008-06-17 | Insweb Corporation | Insurance rating calculation software component architecture |
US6614453B1 (en) | 2000-05-05 | 2003-09-02 | Koninklijke Philips Electronics, N.V. | Method and apparatus for medical image display for surgical tool planning and navigation in clinical environments |
US7085805B1 (en) * | 2000-07-07 | 2006-08-01 | Sun Microsystems, Inc. | Remote device management in grouped server environment |
JP2004505354A (ja) | 2000-07-20 | 2004-02-19 | ベル ゲイト インヴェストメント ベスローテン フェンノートシャップ | データ転送を保護して装置を通信させる方法及びシステム及びそのための装置 |
US6925632B2 (en) * | 2001-03-08 | 2005-08-02 | Martin Shiu | System for configuration programming |
EP1246059B1 (de) * | 2001-03-26 | 2006-08-30 | Sun Microsystems, Inc. | Anforderungsbedingte dynamische Schnittstellengenerierung |
WO2002101564A1 (fr) * | 2001-06-12 | 2002-12-19 | Tops Systems Corporation | Systeme multiprocesseur, procede permettant de le concevoir et systeme de multiprocesseur decrit en langage de description de materiel |
DE10157633A1 (de) * | 2001-11-26 | 2003-08-28 | Siemens Ag | Medizinische Systemarchitektur mit einer komponentenorientierten Architektur zur Befundung und Dokumentation |
US20030182426A1 (en) * | 2002-03-21 | 2003-09-25 | Sun Microsystems, Inc. | Apparatus and method of lazy connection transaction enlistment |
US20040034860A1 (en) * | 2002-08-15 | 2004-02-19 | Microsoft Corporation | Dynamically extensible application program framework including message and notification routing |
CN1264090C (zh) * | 2002-12-31 | 2006-07-12 | 上海科泰世纪科技有限公司 | 调用构件对象功能的智能指针的封装方法 |
CA2438362C (en) * | 2003-08-26 | 2011-05-31 | John William Comeau | A method and system for synchronizing a client user interface with server backend |
US7681184B1 (en) | 2004-05-24 | 2010-03-16 | Borland Software Corporation | System and methodology for cross language type system compatibility |
US7499899B2 (en) * | 2004-07-02 | 2009-03-03 | Northrop Grumman Corporation | Dynamic software integration architecture |
US7636888B2 (en) * | 2005-03-15 | 2009-12-22 | Microsoft Corporation | Verifying compatibility between document features and server capabilities |
CN104407518B (zh) | 2008-06-20 | 2017-05-31 | 因文西斯系统公司 | 对用于过程控制的实际和仿真设施进行交互的系统和方法 |
US8463964B2 (en) | 2009-05-29 | 2013-06-11 | Invensys Systems, Inc. | Methods and apparatus for control configuration with enhanced change-tracking |
US8127060B2 (en) | 2009-05-29 | 2012-02-28 | Invensys Systems, Inc | Methods and apparatus for control configuration with control objects that are fieldbus protocol-aware |
US20140309970A1 (en) * | 2013-04-11 | 2014-10-16 | The Boeing Company | Managing a model having an object cycle |
WO2015108748A1 (en) | 2014-01-17 | 2015-07-23 | Fair Isaac Corporation | Cloud-based decision management platform |
US10037187B2 (en) * | 2014-11-03 | 2018-07-31 | Google Llc | Data flow windowing and triggering |
US10162630B2 (en) | 2014-11-11 | 2018-12-25 | Fair Isaac Corporation | Configuration packages for software products |
US11650816B2 (en) | 2014-11-11 | 2023-05-16 | Fair Isaac Corporation | Workflow templates for configuration packages |
US10380508B2 (en) * | 2016-04-25 | 2019-08-13 | Fair Isaac Corporation | Self-contained decision logic |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4800488A (en) * | 1985-11-12 | 1989-01-24 | American Telephone And Telegraph Company, At&T Bell Laboratories | Method of propagating resource information in a computer network |
AU628264B2 (en) * | 1990-08-14 | 1992-09-10 | Oracle International Corporation | Methods and apparatus for providing a client interface to an object-oriented invocation of an application |
DE69126857T2 (de) * | 1991-01-18 | 1998-01-08 | Ibm | Objektorientierte Programmierungsplattform |
US5307490A (en) * | 1992-08-28 | 1994-04-26 | Tandem Computers, Inc. | Method and system for implementing remote procedure calls in a distributed computer system |
US5315703A (en) * | 1992-12-23 | 1994-05-24 | Taligent, Inc. | Object-oriented notification framework system |
CA2128387C (en) * | 1993-08-23 | 1999-12-28 | Daniel F. Hurley | Method and apparatus for configuring computer programs from available subprograms |
US5517645A (en) * | 1993-11-05 | 1996-05-14 | Microsoft Corporation | Method and system for interfacing components via aggregate components formed by aggregating the components each with an instance of a component manager |
-
1993
- 1993-11-05 US US08/147,683 patent/US5517645A/en not_active Expired - Lifetime
-
1994
- 1994-10-28 CA CA002134616A patent/CA2134616C/en not_active Expired - Fee Related
- 1994-11-04 DE DE69424744T patent/DE69424744T2/de not_active Expired - Lifetime
- 1994-11-04 JP JP27008594A patent/JP3429873B2/ja not_active Expired - Lifetime
- 1994-11-04 EP EP94117451A patent/EP0652512B1/de not_active Expired - Lifetime
-
1995
- 1995-11-15 US US08/559,694 patent/US5794038A/en not_active Expired - Lifetime
-
2002
- 2002-02-19 JP JP2002041878A patent/JP4027679B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JPH07182172A (ja) | 1995-07-21 |
EP0652512B1 (de) | 2000-05-31 |
EP0652512A3 (de) | 1995-08-16 |
CA2134616C (en) | 2004-01-27 |
JP4027679B2 (ja) | 2007-12-26 |
JP3429873B2 (ja) | 2003-07-28 |
DE69424744D1 (de) | 2000-07-06 |
EP0652512A2 (de) | 1995-05-10 |
CA2134616A1 (en) | 1995-05-06 |
US5794038A (en) | 1998-08-11 |
US5517645A (en) | 1996-05-14 |
JP2002318690A (ja) | 2002-10-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
DE69424744T2 (de) | Verfahren und System zur Verwaltung von Komponentenverbindungen | |
DE69425548T2 (de) | Verfahren und Vorrichtung zur dynamischen Objektverbindungserzeugung | |
DE69425699T2 (de) | Integrierung von Systemverwaltungsdiensten mit einem unterliegenden Systemobjektmodell | |
DE69327138T2 (de) | Verfahren zur Namensgebung und zur Bindung von Objekten | |
DE69425318T2 (de) | Verfahren und System für Fernausführung von Codes | |
DE69425470T2 (de) | Verfahren zur Ereignismeldung in einem Betriebssystem | |
DE69616449T2 (de) | Vorrichtung zum Hinzufügen von Attributen zu einem Objekt während der Laufzeit in einer objektorientierten Rechnerumgebung | |
DE69637436T2 (de) | Objektorientiertes Kommunikationssystem mit Unterstützung für mehrere entfernte Maschinentypen | |
DE69131745T2 (de) | Verfahren und Gerät zum Verschaffen einer Kundenschnittstelle zu einem objektorientierten Aufruf eines Anwendungsprogramms | |
DE69131245T2 (de) | Verfahren und Gerät zum Verschaffen von dynamischen Aufrufen von Anwendungsprogrammen in einer verteilten heterogenen Umgebung | |
DE69309485T2 (de) | Verfahren zur verteilung von schnittstellenzeigern fur fernprozeduranrufe | |
DE69533530T2 (de) | Verfahren und System zur dynamischen Aggregation von Objekten | |
DE69405408T2 (de) | Objektorientiertes system und verfahren zur hardwarekonfiguration | |
DE69609516T2 (de) | Verfahren zur verwaltung dynamischer relationen zwischen objekten in dynamisch objektorientierten programmiersprachen | |
DE69131742T2 (de) | Verfahren zur Realisierung von Anbieterfunktionen in einer verteilten heterogenen Umgebung | |
DE69621494T2 (de) | Vorrichtung und Verfahren eines verteilten Fehlerbeseitigers zur Fehlerbeseitigung von verteilten Anwendungsprogrammen | |
DE69429686T2 (de) | Transaktionsverwaltung in objektorientiertem System | |
DE69726004T2 (de) | Generische software-zustandsmaschine und verfahren zur konstruktion von dynamischen objekten für ein anwendungsprogramm | |
DE10128883A1 (de) | Verfahren und System für die Verteilung von Anwendungsdaten auf verteilte Datenbanken mit verschiedenen Formaten | |
DE69030551T2 (de) | Prozess und Gerät zur Handhabung zeitaufwendiger und wiederverwendbarer Abfragen in einem objekt-orientierten Datenbankverwaltungssystem | |
DE69230842T2 (de) | Verfahren und Gerät zur Verwaltung von erweiterbaren Verbindungen zwischen Anwendungsprogrammen | |
EP0825524A1 (de) | Verfahren zur Verwaltung der Benennung von Objekten | |
DE937285T1 (de) | Verfahren und system zum erstellen von sofrware-komponenten und von aus unabhängigen teilen aufgebauten systemen | |
DE69328664T2 (de) | Verfahren und Anordnung zur Zusammenbindung von Objekten | |
DE69702192T2 (de) | Rahmenwerksystem für gemeinsame dokumente-konstruktion mit kollaborativem mehrfachbenutzerzugriff |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
8364 | No opposition during term of opposition |