Prof. Dr.-Ing. Franz-Josef Behr

Slides:



Advertisements
Ähnliche Präsentationen
Be.as WEB Technologie
Advertisements

C ommon O bject R equest B roker A rchitecture
Objektorientierte Programmierung
Kritische Betrachtung
DI Christian Donner cd (at) donners.com
Objektorientierte Programmierung
Java: Objektorientierte Programmierung
Indirekte Adressierung
Java: Grundlagen der Sprache
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Cassey - Common Answer Set Evaluation sYstem Jean Gressmann Benjamin Kaufmann Robert Lenk.
Klassenvariable (auch Klassendaten bzw. statische Attribute genannt) und statische Methoden.
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
Ein Beispiel in Java.
Konstruktoren.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
Oracle WebServer - Einführung. © Prof. T. Kudraß, HTWK Leipzig Oracle Web Application Server HTML WebServer ® File system Static HTML PL/SQL Packages.
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
JAVA RMI.
Treffen mit Siemens Siemens: Werner Ahrens Volkmar Morisse Projektgruppe: Ludger Lecke Christian Platta Florian Pepping Themen:
COM (Component Object Model) / DCOM (Distributed COM)
Introducing the .NET Framework
Strukturänderungen Verteilte Anwendungen Wintersemester 06/07 © Wolfgang Schönfeld.
Objektorientierte Programmierung
DVG Einführung in Java1 Einführung in JAVA.
DVG Klassen und Objekte
Seite Common Gateway Interface. Konzepte. Übersicht 1Einleitung 2Was ist CGI? 3Wozu wird CGI verwendet? 4Geschichtlicher Überblick 5Grundvoraussetzungen.
UML Begleitdokumentation des Projekts
Common Object Request Broker anhand eines Beispiels Aufgabestellung ( Ein Konto wird von einem Server verwaltet. Der Stand des Kontos wird.
Prof. Dr. Gerhard Schmidt pres. by H.-J. Steffens Software Engineering SS 2009Folie 1 Objektmodellierung Objekte und Klassen Ein Objekt ist ein Exemplar.
Was umfaßt die CORBA Core Spezifikation? Welche zusätzlichen Komponenten muß ein ORB Produkt beinhalten? Core: CORBA Objekt Modell CORBA Architektur OMG.
Einführung in die Programmierung
Herzlich Willkommen zu „Einführung in die Programmierung mit Java“
Entwicklung verteilter Anwendungen I, WS 13/14 Prof. Dr. Herrad Schmidt WS 13/14 Kapitel 12 Folie 2 Web Services (1)
Game Development mit LUA Integration und Kommunikation von LUA mit C++ Referat von Paul van Hemmen Seminar: Reusable Content in 3D und Simulationssystemen.
Copyright 2011 Bernd Brügge, Christian Herzog Grundlagen der Programmierung TUM Wintersemester 2011/12 Kapitel 11, Folie 1 2 Dr. Christian Herzog Technische.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Windows Presentation Foundation, Vorlesung Wintersemester 2013/14 Prof. Dr. Herrad Schmidt WS 13/14 Kapitel 2 Folie 2 XAML (1) s.a.
Entwicklung verteilter Anwendungen I, WS 13/14 Prof. Dr. Herrad Schmidt WS 13/14 Kapitel 1 Folie 2 Microsoft.NET Framework: Quelle:
Entwicklung verteilter Anwendungen II, SS 13 Prof. Dr. Herrad Schmidt SS 13 Kapitel 4 Folie 2 REST Web Services (1)
Windows Presentation Foundation, Vorlesung Wintersemester 2013/14 Prof. Dr. Herrad Schmidt WS 13/14 Kapitel 9 Folie 2 ADO.NET (1) Klassen für Zugriffe.
Welchen Problemen ist man bei heterogener, verteilter Programmierung ausgesetzt? Hardware: nicht einheitliche, inkompatible Systeme, verschiedene Leistungsfähigkeit.
Beschreiben Sie das Szenario wenn ein ORB einen Server aktiviert und eine Objektimplementation aufruft. Activate Server impl_is_ready Activate Object (GetID.
CGI (Common Gateway Interface)
Zeit:Aktion: 08:30Begrüßung, Organisation 08:45Einführung - Was heißt OPC - OLE for Process Control --> Folie - OPC definiert eine offene Schnittstelle,
Grundlagen wissenschaftlichen Arbeitens An Overview of C++ Ali CICEK
Oliver Spritzendorfer Thomas Fekete
Office in Java 2. Info-Point Urs Frei.
Prof. Dr.-Ing. Franz-Josef Behr
MTS Microsoft Transaction Server Martin Basziszta
Programmieren ... in C++ Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I.
iMAS Schnittstellen - Übersicht
Programmiervorkurs WS 2014 Referenzdatentypen
Voyager Eigenschaften/Vorzüge Universalität: –ROI-Modelle: CORBA, RMI, DCOM –verschiedene Namens-, Verzeichnisdienste Nachrichtentypen: synchron, oneway,
IPv6 Von Judith Weerda Diese Vorlage kann als Ausgangspunkt für die Präsentation von Schulungsmaterialien in einer Gruppensitzung dienen. Abschnitte.
Informatik I : Software höhere Programmiersprachen Java Klassen: hat Methoden (Funktionen) und Daten (Variablen) es kann mehrere Klassen geben nur eine.
Microsoft.NET InfoPoint 8. Juni 2005 Stefan Bühler.
Schutzvermerk nach DIN 34 beachten Was ist DCOM ?.
Webserver Apache & Xampp Referenten: Elena, Luziano und Sükran
C++ FÜR cOMPUTERSPIELENTWICKLER
 Präsentation transkript:

Prof. Dr.-Ing. Franz-Josef Behr Goto COM Prof. Dr.-Ing. Franz-Josef Behr Prof. Dr.-Ing. Franz-Josef Behr

Literatur Loos, Peter: Go to COM. 672 Seiten - Addison-Wesley, 2000 COM/DCOM, Microsofts Standard für Componentware, http://www.informatik.uni-bonn.de/~ur/lectures/ss2002/folien/HJ-de-COM.ppt, 08.01.2005 Sherif Moustafa, 2001: Verteilte Informationssysteme - DCOM/OLE, http://www.informatik.uni-bonn.de/~tb/Lehre/ws00/sVS/Ausarbeitungen/Moustafa.doc, 08.01.2005 Prof. Dr.-Ing. Franz-Josef Behr

Warum COMponentware? Traditionelle Software (wie unsere bisherige) unübersichtliche, monolithische Struktur aufwendig zu erstellen schwierig zu warten bzw. an Umweltveränderungen anzupassen COMponentware besteht aus wiederverwendbaren, kombinierbaren Funktionseinheiten (Komponenten) Komponenten sind sprachenunabhängig fertige Komponenten stehen in Softwarebibliotheken zur Verfügung -> schnelle, flexible Entwicklung und Aktualisierung von Softwaresystement Prof. Dr.-Ing. Franz-Josef Behr

Wie läßt sich ein System so erstellen, so dass ausführbare Anwendungen in binärer Form, die von verschiedenen Herstellern zu verschiedenen Zeitpunkten erstellt worden, miteinander kommunizieren können? Ansätze: Microsofts Distributed Component Object Model (DCOM) als Nachfolger von COM/OLE, Common Object Request Broker Architecture (CORBA) der Object Management Group (OMG). Prof. Dr.-Ing. Franz-Josef Behr

Component Objekt Model (COM) wurde 1995 mit OLE 2.0 eingeführt und war lange eine von Microsofts Schlüsseltechnologien zur Weiterentwicklung seiner Betriebsysteme und Anwendungssoftware COM’s Architektur stellt die Grundlage von „higher level“ Software Dienste dar: Grafik (‚DirectX‘), Datenbankzugriff (‚OLE DB‘), Dateisysteme (‚Active Directory Services‘), Anwenderprogramme (Word, Excel, Internet Explorer, …, und natürlich GI-Systeme wie GeoMedia und MapInfo) ein objektbasiertes Programmiermodell, das in einer Spezifikation beschrieben ist definiert Mechanismen für die Wiederverwendbarkeit und Interoperabilität von Komponenten enthält mit der COM-Bibliothek eigenen Code funktioniert nach dem klassischen Client-Server-Prinzip Prof. Dr.-Ing. Franz-Josef Behr

Geschichte von COM/DCOM Windows- Zwischenablage 1987 Verteilte Datenverarbeitung 1980er Object Linking and Embedding (OLE 1) 1992 Open Software Foundation Distributed Computing Environment Remote Procedure Calls (OSF DCE RPC) Ende 80er Component Object Model (COM) 1995 Distributed COM (DCOM) 1996

Geschichte COM / DCOM Windows- Zwischenablage 1987 Object Linking and Embedding (OLE 1) 1992 Component Object Model (COM) 1995 Distributed COM (DCOM) 1996 Verteilte Datenverarbeitung 1980er Open Software Foundation Distributed Computing Environment Remote Procedure Calls (OSF DCE RPC) Ende 80er Heute: Ablösung durch .net Prof. Dr.-Ing. Franz-Josef Behr

Bekannt: Schnittstelle Objekt Öffentliche Schnittstellen Methoden Eigenschaften Eigenschaften: private Setzen und Abfragen nur über get- und set-Methoden Prof. Dr.-Ing. Franz-Josef Behr

Hinführung Objektinstanz anlegen: CPoint * pPoint = new CPoint(5.0,9.0); Geschieht dies im gleichen Programm: "Kein Problem" Bei Nutzung derselben Klasse in mehreren Programmen: Klasse verfügbar über .h-Datei "Kein Problem" Problem jedoch: Über Programmgrenzen hinweg bei Nutzung in anderen Programmiersprachen Prof. Dr.-Ing. Franz-Josef Behr

Idee System verteilter Objekte Instanzen können über Programmgrenzen hinweg angelegt werden Mit verschiedenen Programmiersprachen Problem: Es existieren möglicherweise viele CPoint-Klassen Jede Klasse / jedes Objekt benötigt eine eindeutige ID Objekte werden von "Objektfabriken" (factories) bereitgestellt. Für alle derzeit und in Zukunft darin vorkommenden Objekte, Schnittstellen, Klassen, Anwendungen und mehr werden sogenannte "Globally Unique IDentifiers" (abgekürzt "GUID"s) erzeugt. --> Identifikation über eine weltweit eindeutige Nummer Prof. Dr.-Ing. Franz-Josef Behr

GUID – Globally Unique Identifier 128 Bit-Zahl, aus einer Menge von Informationen gebildet. unter anderem wird die MAC-Adresse der Netzwerkkarte bei der Erstellung einer GUID verwendet um sicherzustellen, dass die GUID weltweit eindeutig ist. Bei der Installation eines Betriebssystems wird auch eine GUID erstellt, die dann eine bestimmte Maschine identifiziert. 128 Bit, groß genug? Würde jeder derzeitige Erdenbewohner, das sind etwa 6 Milliarden Menschen (Größenordnung 109), rund um die Uhr 100 Billionen (1014) GUIDs pro Sekunde erzeugen, würde es knapp 20 Millionen Jahre dauern, bis der mögliche Vorrat von 3,4 x 1038 Zahlen ausgeschöpft wäre! (Quelle: Kraig Brockschmidt: Inside OLE, Microsoft Press, nach http://www.aboutvb.de/khw/artikel/khwcreateguid.htm) Prof. Dr.-Ing. Franz-Josef Behr

GUID – Darstellung Üblicherweise in hexadezimaler Form in einer bestimmten Formatierung dargestellt, beispielsweise: {C1D11C25-45D2-11D0-B0E2-444553540000} Prof. Dr.-Ing. Franz-Josef Behr

CLSID (ClassIDentifier) ein Name für ein Objekt spezielle Form eines GUID, also ein weltweit eindeutiger Bezeichner. 16-byte Wert, der 32 Hexadezimal Ziffern enthält. Diese Ziffern sind in Gruppen angeordnet: 8-4-4-4-12. CLSIDs werden benutzt, um OLE Objekte eindeutig identifizieren zu können. Diese Objekte haben Eigenschaften und Methoden. Methode ist ein Vorgang, der ausgeführt wird, wenn mit diesem Objekt gearbeitet wird, z. B. ein Doppelklick, wenn ein anderes Objekt darauf per Maus "gedropt" wird usw. Damit ein Objekt, welches durch seine CLSID repräsentiert wird, eine Methode besitzt, muss natürlich ein Programm vorhanden sein, welches diese Methode ausführt.   Prof. Dr.-Ing. Franz-Josef Behr http://www.winfaq.de/faq_html/tip0313.htm

Praxis: Nutzung einer CLSID Wenn Sie ein Icon zum Aufruf solcher Funktionen anlegen wollen, legen Sie an der gewünschten Stelle (Desktop oder Startmenü) einen neuen Ordner an. Als Namen für den Ordner geben Sie eine Beschreibung, gefolgt von einem Punkt, und dann die CLSID-Nummer [Name.{CLSID-Nummer}] (z. B. Systemsteuerung.{21EC2020-3AEA-1069-A2DD-08002B30309D}) ein. Prof. Dr.-Ing. Franz-Josef Behr

Praxis: CLSID besorgen #define STRICT #include <objbase.h> #include <stdio.h> #include <assert.h> #include <iostream> using namespace std; Int main (void) { GUID guid; // create guid HRESULT hr = CoCreateGuid (& guid); assert (hr == S_OK); // convert GUID into string OLECHAR szCLSID [256]; int len = StringFromGUID2 (guid, szCLSID, 256); assert (len != 0); printf ("CoCreateGuid: %S\n", szCLSID); cout << "CoCreateGuid: " << szCLSID << endl << endl; return 0; } Prof. Dr.-Ing. Franz-Josef Behr

Rückgabewerte von COM-Funktionen HRESULT hr = CoCreateGuid (& guid); HRESULT = "Handle to result" = Verweis auf 32-Bit-Ergebniswert (vgl. WIN-API) -> in Datei winerror.h definiert. Prof. Dr.-Ing. Franz-Josef Behr

Von der CLSID zur ProgID ProgID = programmatische ID, Zeichenkette, die einer CLSID eine für uns lesbare Darstellung zuordnet. ProgID müssen nicht weltweit eindeutig sein. Namenskonvention: <Hersteller>.<Klasse>.<Version> Bsp.: Word.Application.8 Prof. Dr.-Ing. Franz-Josef Behr

Registrierungsdatenbank: Zentrale Sammelstelle der ProgIDs Registrierungsdatenbank = System Registry Hauptschlüssel: HKEY_CLASSES_ROOT: Verknüpfungen von Applikation und Dateinamenserweiterungen, Registrierung aller COM-Komponenten HKEY_CURRENT_USER: Informationen des aktuellen Benutzers HKEY_LOCAL_MACHINE: rechnerspezifische Informationen, wie z. B. über eingebaute Hardware HKEY_USERS: Informationen zu allen angemeldteten Benutzern HKEY_CURRENT_CONFIG: Daten zur aktuellen Konfiguration (angeschlossener Drucker usw.) HKEY_DYN_DATA: dynamische Statusinformationen (Anzahl der Prozesse usw.) Zugriffsfunktionen RegOpenKeyEx: Öffnen eines Haupt- oder Unterschlüssels RegQueryValueEx: Attributwert lesen RegCloseKey: Handle für Zugriff auf Registry wieder freigeben Prof. Dr.-Ing. Franz-Josef Behr

Registrierungsdatenbank: Zentrale Sammelstelle der ProgIDs II Registrieren von Komponenten manuell oder automatisch von der Komponente selbst. Ohne einen Eintrag in der Registry kann kein Client die gewünschte Klasse lokalisieren und instantiieren! Prof. Dr.-Ing. Franz-Josef Behr

Praxis: ProgIDvon WinWord #define STRICT #include <objbase.h> #include <stdio.h> #include <assert.h> void main (void) { long ret; // open the specified key HKEY hKey; ret = RegOpenKeyEx ( // Öffnen eines Haupt- oder Unterschlüssels HKEY_CLASSES_ROOT, // handle to open key "Word.Application.8\\CLSID", // subkey name (DWORD) 0, // reserved KEY_READ, // security access mask & hKey // pointer to key handle ); assert (ret == ERROR_SUCCESS); // retrieves data for the specified value name BYTE dwData [256]; DWORD dwDataSize = sizeof (dwData); ret = RegQueryValueEx ( // Attributwert lesen hKey, // handle to key "", // empty string (default value) (DWORD *) 0, // reserved (DWORD *) 0, // type of data (ignored) dwData, // buffer to receive data & dwDataSize // size of buffer printf ("CLSID of \"Word.Application.8\\CLSID\":\n%s\n", dwData); // release handle to the specified key ret = RegCloseKey (hKey ); // handle to key to close return; } Prof. Dr.-Ing. Franz-Josef Behr

Praxis: ProgIDvon WinWord Prof. Dr.-Ing. Franz-Josef Behr

COM-Klasse Konkrete Implementierung einer oder mehrer COM-Schnittstellen; auch als CoClass bezeichnet; Name der Klasse: eindeutige CLSID, optional ProgID (besser lesbar) Prof. Dr.-Ing. Franz-Josef Behr

Das COM-Objekt bietet seine Funktionen als Methoden für Clients über eine oder mehrere Schnittstellen an kann von Clients über einen Schnittstellenzeiger angesprochen werden Clients erhalten nach der Instantiierung eines Objekts automatisch einen Schnittstellenzeiger auf dessen Schnittstelle IUnknown jede Schnittstelle muß die virtuellen Funktionen von IUnknown erben, jede COM-Klasse muß diese Funktionen implementieren IUnknown-Methoden können über jede Schnittstelle aufgerufen werden die Methoden von IUnknown liefern dem Client Zeiger auf weitere Schnittstellen des Objekts und übernehmen eine Referenzzählung zur Speicherverwaltung Prof. Dr.-Ing. Franz-Josef Behr

Schnittstellenbegriff in COM Zusammenfassung einer oder mehrerer (semantisch zusammengehöriger) Methoden zu einer logischen Gruppe, die in C++ mit Hilfe einer rein abstrakten Basisklasse definiert werden. Der Zugriff auf die COM-Schnittstelle sind durch ein binäres Standardformat vorgegeben. Auf allen Plattformen definiert COM eine Standardmethode, um die sog. virtuellen Funktionstabellen (VTBL) in den Arbeitsspeicher zu laden, sowie eine Standardmethode, um Funktionen mit Hilfe solcher Tabellen aufzurufen. Virtuelle Tabellen sind eine Menge von Zeigern, die auf verschiedene Funktionen zeigen, d.h. eine beliebige Programmiersprache, welche in der Lage ist, Funktionen durch Zeiger aufzurufen, ist dazu geeignet, Komponenten zu erstellen, die mit anderen Komponenten kommunizieren können. Prof. Dr.-Ing. Franz-Josef Behr

Ein Zeiger auf eine COM-Schnittstelle ist ein Zeiger auf eine vtbl (virtuelle Funktionszeigertabelle), die der korrespondierenden abstrakten Basisklasse zugeordnet ist. Prof. Dr.-Ing. Franz-Josef Behr

Schnittstellendefinition wird vom Entwickler in einer Schnittstellendefinitionsdatei durch eine abstrakte Basisklasse definiert Werkzeug zum generieren von Schnittstellendefinitionsdateien ist der Microsoft Interface Definition Language (MIDL) - Compiler die Schnittstellendefinitionsdatei muß als Header-Datei von Client und Komponente benutzt werden -> es wird ein Binärstandard erreicht Schnittstellen dürfen nach ihrer Veröffentlichung nicht mehr geändert werden COM definiert eine Vielzahl von Standardschnittstellen, deren Methoden der Entwickler in der Komponente jedoch selbst implementieren muss. Prof. Dr.-Ing. Franz-Josef Behr

Schnittstellendefinition Schnittstellendefinitionsdatei in IDL MIDL-Compiler Header-Datei mit Schnittstellendefinition Client-Projekt kann Schnittstellenzeiger bilden Server-Projekt vererbt Basisklasse und implementiert deren Member-Funktionen Prof. Dr.-Ing. Franz-Josef Behr Quelle: http://www.informatik.uni-bonn.de/~ur/lectures/ss2002/folien/HJ-de-COM.ppt

Prof. Dr.-Ing. Franz-Josef Behr

IUnknown: das grundlegende Interface Jedes COM- Objekt besitzt dieses Interface. dient zur Identifizierung eines unbekannten COM Objektes. Clients erhalten nach Instantiierung eines Objekts automatisch Schnittstellenzeiger auf dessen Schnittstelle IUnknown IUnknown-Methoden können über jede Schnittstelle aufgerufen werden Methoden von IUnknown liefern dem Client Zeiger auf weitere Schnittstellen des Objekts und übernehmen eine Referenzzählung zur Speicherverwaltung Interface IUnknown { virtual HRESULT QueryInterface(IID& iid, void ** ppvObj) = 0; virtual ULONG AddRef() = 0; virtual ULONG Release() = 0; } Prof. Dr.-Ing. Franz-Josef Behr

ActiveX Controls Interfaces http://www.uni-weimar.de/~grolla/docs/com/ Prof. Dr.-Ing. Franz-Josef Behr

IUnknown-Methoden QueryInterface: Überprüft, nach Angabe dieses bestimmten Interfaces, ob der aktuelle COM-Objekt dieses implementiert, und wenn dem so ist, wird die Referenz auf diesem Interface zurückgeliefert. AddRef: Ist dafür zuständig, den Referenzzähler zu erhöhen, wenn eine neue Referenz übergeben wird. Release: Ist dafür zuständig, den Referenzzähler zu erniedrigen, wenn eine Referenz verbraucht wird. Sobald der Wert des Zählers null ist, wird das COM Objekt unerreichbar und somit vernichtet. Prof. Dr.-Ing. Franz-Josef Behr

Lebensdauer eines COM-Objekts Der Referenzzähler eines COM-Objekts wird durch die Methoden AddRef nd Release beeinflusst (Quelle: Loos 2001). Prof. Dr.-Ing. Franz-Josef Behr

Aufbau einer COM-Applikation Anmelden bei COM Umwandlung ProID nach CLSID Erzeugen eines COM-Objekts Bestimmen Schnittstellenzeigers anfordern Methode aufrufen Schnittstellenzeigers wieder freigeben Aufräumen, Speicherplatzfreigabe Abmelden von COM Prof. Dr.-Ing. Franz-Josef Behr Quelle: http://www.informatik.uni-bonn.de/~ur/lectures/ss2002/folien/HJ-de-COM.ppt

COM-Ereignissystem Prof. Dr.-Ing. Franz-Josef Behr

Anmelden bei COM Jedes COM-orientierte Windows-Programm, egal ob Client oder Server, muss sich vor dem ersten Zugriff auf das COM-Laufzeitsystem durch die CoInitialize Funktion bei COM anmelden: ... int main () { ODS0 ("[HelloClient]\tentering main\n"); // initialize COM libraries HRESULT hr = CoInitialize ((LPVOID) 0); Prof. Dr.-Ing. Franz-Josef Behr

Umwandlung ProID nach CLSID // convert ProgID into corresponding CLSID CLSID CLSID_HelloWorldServer; hr = CLSIDFromProgID (L"HandsOnCOM.HelloWorld.1", &CLSID_HelloWorldServer ); Prof. Dr.-Ing. Franz-Josef Behr

Erzeugen eines COM-Objekts verschiedene Alternativen: Die am häufigsten vorkommende (und auch am einfachsten zu nutzende) ist die Funktion CoCreateInstance der COM-Bibliothek. Nachdem ein Client die COM-Bibliothek mit dem Aufruf CoInitialize initialisiert hat, kann er diese Funktion aufrufen, um eine Instantiierung einer registrierten Klasse zu veranlassen. Diese Funktion muss für jedes zu erstellende Objekt aufgerufen werden. // create a HelloWorld object IUnknown * pIUnknown; hr = CoCreateInstance ( CLSID_HelloWorldServer, // CLSID of object (IUnknown *) 0, // object is not part of an aggregate CLSCTX_INPROC_SERVER, // see CLSCTX enumeration IID_IUnknown, // requested interface identifier (void **) & pIUnknown // return value ); Der erste Parameter spezifiziert die CLSID der gewünschten Klasse. Der zweite Parameter ist nur in Zusammenhang mit Aggregation von Bedeutung und bei uns NULL. Über den dritten Parameter spezifizieren wir, dass das Objekt im eigenen Adressraum instantiiert werden soll. Für Nutzung eines OutProcServers würden wir CLSCTX_LOCAL_SERVER, für einen Server auf einem anderen Server CLSCTX_REMOTE_SERVER[1] spezifizieren (siehe wtypes.h). Beim vierten Parameter ist die Schnittstelle zu spezifizieren, mit der der Client arbeiten möchte, in unserem Fall eigentlich ISayHello. Der Einfachkeit halber (und aus didaktischen Gründen) fordern wir zunächst den IID_IUnknown-Schnittstellenzeiger an. Von im wissen wir, dass er von dem erzeugten COM-Objekt zur Verfügung gestellt wird. Die Anforderung des Schnittstellenzeigers für ISayHello kann in einem nachfolgenden Implementierungsschritt erfolgen, um an dieser Stelle nicht zwei getrennte Funktionalitäten zu vermischen. CoCreateInstance ruft intern die Funktion CoGetClassObject auf, die sich dann an den Service Control Manager (SCM) wendet, eine Komponente der COM-Bibliothek[2]. Der SCM sucht in der Registrierung nach der CLSID, erzeugt das Objekt und reicht den empfangenen IUnknown-Schnittstellenzeiger an den Client weiter. Dieser kann dann direkt mit dem Objekt kommunizieren. Falls die Komponente nicht im Prozeßraum des Clients ausgeführt wird, erstellt COM automatisch nach der Objektinstantiierung ein Stub-Objekt für den Server und ein Proxy-Objekt für den Client. Prof. Dr.-Ing. Franz-Josef Behr

1. Parameter: spezifiziert CLSID der gewünschten Klasse. 2. Parameter: ist nur in Zusammenhang mit Aggregation von Bedeutung und bei uns NULL. 3. Parameter: wir spezifizieren, dass das Objekt im eigenen Adressraum instantiiert werden soll. Für Nutzung eines OutProcServers würden wir CLSCTX_LOCAL_SERVER, für einen Server auf einem anderen Server CLSCTX_REMOTE_SERVER[1] spezifizieren (siehe wtypes.h). 4. Parameter: Schnittstelle zu spezifizieren, mit der der Client arbeiten möchte, in unserem Fall eigentlich ISayHello. Der Einfachkeit halber (und aus didaktischen Gründen) fordern wir zunächst den IID_IUnknown-Schnittstellenzeiger an. Von im wissen wir, dass er von dem erzeugten COM-Objekt zur Verfügung gestellt wird. Die Anforderung des Schnittstellenzeigers für ISayHello kann in einem nachfolgenden Implementierungsschritt erfolgen, um an dieser Stelle nicht zwei getrennte Funktionalitäten zu vermischen. Prof. Dr.-Ing. Franz-Josef Behr

CoCreateInstance Erzeugt einen Interface Zeiger zu einer nicht initialisierten Instanz einer Objektklasse CoCreateInstance ruft intern die Funktion CoGetClassObject auf, die sich dann an den Service Control Manager (SCM) wendet, eine Komponente der COM-Bibliothek. Der SCM sucht in der Registrierung nach der CLSID, erzeugt das Objekt und reicht den empfangenen IUnknown-Schnittstellenzeiger an den Client weiter. Dieser kann dann direkt mit dem Objekt kommunizieren. Falls die Komponente nicht im Prozessraum des Clients ausgeführt wird, erstellt COM automatisch nach der Objektinstantiierung ein Stub-Objekt für den Server und ein Proxy-Objekt für den Client. Prof. Dr.-Ing. Franz-Josef Behr

Bestimmten Schnittstellenzeigers anfordern Die Verhandlungen über einen bestimmten Schnittstellenzeiger (hier ISayHello werden im folgenden Codeabschnitt durchgeführt: // request ISayHello interface ISayHello * pISayHello; hr = pIUnknown -> QueryInterface ( IID_ISayHello, (void **) & pISayHello ); Prof. Dr.-Ing. Franz-Josef Behr

Methode aufrufen Mit Hilfe des ISayHello- Schnittstellenzeigers können wir nun auf die Methoden dieser Schnittstelle aufrufen: hr = pISayHello->SayHello (szHello); // =============================================================== // interface ISayHello interface ISayHello : public IUnknown { // ISayHello methods STDMETHOD (SayHello) (BSTR szMessage) PURE; }; Prof. Dr.-Ing. Franz-Josef Behr

Schnittstellenzeigers wieder freigeben // release interface pointer hr = pISayHello -> Release (); hr = pIUnknown -> Release (); Prof. Dr.-Ing. Franz-Josef Behr

Aufräumen, Speicherplatzfreigabe Für den Aufruf hr = pISayHello -> SayHello (szHello) musste eine BSTR-Variable mit SysAllocString erzeugt werden, die jetzt wieder freigegeben wird: // free BSTR SysFreeString (szHello); Prof. Dr.-Ing. Franz-Josef Behr

Abmelden von COM Sind keine weiteren Zugriffe mehr auf ds COM-System vorgesehen, melden wir uns wieder von COM ab: // release COM libraries CoUninitialize (); Prof. Dr.-Ing. Franz-Josef Behr

COM-Server, COM-Client Definition COM-Server: Binärdatei (.exe oder .dll), die die Realisierung einer oder mehrerer COM-Klassen enthält und Objekte für Client (Erzeugung, Zugriff über Schnittstellenzeiger) bereitstellt. Definition COM-Client: Windows-Programm, das Erzeugung eines (oder mehrerer) COM-Objekte veranlasst und seine Methoden aufruft. Prof. Dr.-Ing. Franz-Josef Behr

Server / Binärdatei: Zwei Arten Windows DLL (Dynamic Link Library, .dll), auch In-Process-Server genannt Eigenständiges Programm (.exe-Datei), auch OutProc-Server genannt Remote Server (Programme, die in Netzwerken benutzt werden können) Prof. Dr.-Ing. Franz-Josef Behr

In-Process-Server (InProc-Server) Dynamic Link Libraries (DLL's) zur Laufzeit in den Prozess des Client-Programmes geladen Funktionsaufrufe zwischen Client und Server können direkt erfolgen. Hieraus resultiert ein sehr günstiges Laufzeitverhalten. Prof. Dr.-Ing. Franz-Josef Behr

Out of Process-Server (OutProc-Server) eigenständig ausführbare Programme (.EXE) separater Prozess Kommunikation mit dem Client über das sogenannte Marshalling. Hierfür ist ein Proxy/Stub-Modul notwendig, welches Funktionsaufrufe in „Inter Process Calls“ (IPC) übersetzt. Dieses Modul kann relativ einfach als Dynamic Link Library bereitgestellt werden. Prof. Dr.-Ing. Franz-Josef Behr

Beide Stellvertreter werden in der Regel durch ein Werkzeug automatisch aufgrund einer Schnittstellendefinition generiert, die mittels IDL verfasst wird. compilieren .tld Prof. Dr.-Ing. Franz-Josef Behr

Transport vom Client zum Server-Prozess Remote Procedure Call (RPC, seit 1997), http://www.opengroup.org/onlinepubs/009629399/toc.htm Für das Verpacken der Parameter in ein übertragbares Paket und seine Übertragung über Prozessgrenzen hinweg wurde der Begriff Marshaling gewählt. Das Auspacken und die Wandlung in eine Format, das für den empfangenden Prozess verständlich ist, wird als Unmarshaling bezeichnet. Hauptvertreter: Typbibliotheks-Marshaling mit vorgefertigter Implementierung Prof. Dr.-Ing. Franz-Josef Behr

Klassenfabrik „Klassenfabriken“ (Class Factories) sind spezielle COM-Klassen, die zum Instanziieren der eigentlichen Objekte dienen. Für jede COM-Klasse muß eine entsprechende Class-Factory implementiert werden. Diese Klassenfabrik muß die Schnittstelle IClassFactory bereitstellen. IClassFactory deklariert die Methoden CreateInstance und LockServer. Mit LockServer kann verhindert werden, daß eine selten benötigte Komponente ständig aus dem Speicher entfernt und wieder neu geladen wird. Prof. Dr.-Ing. Franz-Josef Behr