PDF 306K
Transcription
PDF 306K
Komponentenbasierte Softwareentwicklung 27.11.2006 Komponentenbasierte Softwareentwicklung Thema: COM / .Net Interop Datum: 27.11.2006 Student: Robert Berger (291608) Seite 1 Robert Berger Komponentenbasierte Softwareentwicklung 27.11.2006 Inhaltsverzeichnis 1Einleitung........................................................................................................................................... 3 2Architektur..........................................................................................................................................4 2.1COM Runtime.............................................................................................................................4 2.2COM Objekte..............................................................................................................................4 2.3Server.......................................................................................................................................... 4 2.4Schnittstellen...............................................................................................................................6 2.5Datentypen.................................................................................................................................. 6 2.6Programme..................................................................................................................................7 3Weiterführende Themen..................................................................................................................... 7 3.1ATL.............................................................................................................................................7 4Zusammenspiel mit .NET (Interop)................................................................................................... 8 4.1Wrapper...................................................................................................................................... 8 4.2Programme..................................................................................................................................9 5Beispiele............................................................................................................................................. 9 5.1ATL Server................................................................................................................................. 9 5.2ATL Client................................................................................................................................11 5.3.NET Client...............................................................................................................................12 5.4.NET Server.............................................................................................................................. 12 5.5Überblick.................................................................................................................................. 13 6Fazit.................................................................................................................................................. 14 7Quellen............................................................................................................................................. 15 8Literatur............................................................................................................................................ 15 Seite 2 Robert Berger Komponentenbasierte Softwareentwicklung 27.11.2006 1 Einleitung COM steht für „Component Object Model“ und stellt genau dies dar. Microsoft hat versucht ein Objektmodell aufzusetzen, welches alle für die komponentenbasierte Entwicklung notwendigen Punkte zu dieser Zeit abdeckt. Das sich aus dem OLE entwickelte COM beherrscht verschiedene Möglichkeiten Komponenten einzubinden. Dazu zählen drei Varianten. Die erste ist eine in den gleichen Prozessraum ausgeführte Komponente, die zweite findet sich in einem eigenen Prozessraum wieder und die dritte sogar auf einem anderen Host. Als Grundlage für alle drei dient die COM und DCOM Runtime, welche sich als Dienst in der Windows Konfiguration ab Microsoft Windows NT wiederfindet. Wie auch das verteilte Objektmodell CORBA nutzt COM die IDL zur Schnittstellendefinition und im Grunde ist es auch genau das was COM eigentlich darstellt, einen Schnittstellen und Binärstandard. Die IDL ist die „Interface Definition Language“, eine Sprache mit der es möglich ist Schnittstellen für COM in einem Binärformat zu definieren. COM ist nur eine Definition, mit der über IDL Schnittstellen Komponenten angesprochen werden können. Die Implementation, die hinter der IDL Schnittstelle liegt ist laut der Spezifikation egal. Dies führt auch dazu, dass COM über alle gängigen Sprachen angesprochen werden kann. Da zur Entwicklungszeit von COM Ende der 90er Jahre Themen wie Reflection oder Garbage Collection nur in vereinzelten Projekten eine Rolle spielten, ist nicht verwunderlich das de Implementationssprache C++, welche diese Eigenschaften nicht mit sich bringt, über „alte“ Techniken, wie „Referenz Counting“ oder „Identificationnumbers“, Probleme bei der Implementierung löst. Die Implementation die hinter COM oftmals liegt enthält wie angedeutet, Referenzzähler, um die Lebenszeit von Objekten zu ermitteln, sowie Identifikationsnummern, die UID (Unique Identifikation Number), welche mit Hilfe der Windows Registratur die Dll und deren Inhalt identifiziert. Dabei stehen verschiedene Identifikationsnummern für die Binärdatei, deren interne zugängliche Klassen oder sogar für Methoden, um diese über dynamisch erfragte Listen aufzurufen, zur Verfügung. Über vordefinierte Schnittstellen ist der Zugriff auf Inhalte einer Dll möglich. Dabei werden Fabriken zur Generierung von Objekten genutzt, welche im Nachhinein in die jeweiligen Schnittstellen konvertiert werden. Diese sind dann dem Programmierer zugänglich und er kann über die in der Schnittstelle festgelegten Methoden auf Funktionen, oder Elemente zugreifen. COM selber gibt dem Programmierer vordefinierte Schnittstellen an die Hand, mit denen er in der Lage ist, andere Schnittstellen zu erfragen, Elementare Funktionen, wie das Erstellen von Zeichenketten in der COM Runtime zu ermöglichen, oder nur Referenzzähler rauf und runter zu zählen. Es existieren Schnittstellen zum Debuggen oder erstellen von eigenen Datentypen und deren Übersetzung (Marshelling) während der Übertragung zur Komponente. Vordefinierte Datentypen kapselt COM in einem einzigen Datentyp, welcher jeweils einen der definierten Basistypen Typen enthält. Seite 3 Robert Berger Komponentenbasierte Softwareentwicklung 27.11.2006 2 Architektur 2.1 COM Runtime Die COM Runtime ist als Windows Dienst, ab der Version Windows NT installiert. Man findet in der Liste der Dienste 3 Einträge, welche auf die COM Laufzeitumgebung schließen lassen. Die ersten beiden, gehören zur COM+ Laufzeitumgebung, welches eine Erweiterung von COM darstellt, mit der Enterprise Services realisiert werden können. Der DCOM Server ist leicht an dem Namen „DCOM-Server“ zu erkennen. Die COM Runtime läuft als elementarer Windowsteil im Hintergrund mit. Dieser sorgt für das aufrufen und einbinden der Komponenten, in den jeweiligen Prozessraum. Weitere Aufgaben, sind die Weiterleitung der Aufrufe, welche als RPC Aufrufe realisiert sind und das übertragen und wandeln der Standarddatentypen kümmert. 2.2 COM Objekte Ein COM Objekt ist eine durch eine Implementation gefüllte Schnittstelle. Dieses COM Objekt ist in alle Schnittstellen wandelbar, die es selber kennt. Über Standardschnittstellen kann diese Wandlung durchgeführt werden und ist von jedem Objekt, bzw. jeder Schnittstelleninstanz möglich. COM Objekte werden in dem jeweils nach Serverart definierten Prozessraum erstellt und nach Zugriff referenziert. Die Persistenz dieser Objekte ist über den Mechanismus des „Reference Counting“ gelöst. Wenn der Nutzer der Komponente keine Verwendung mehr für diese hat und somit deren Referenzzähler zurückzählt, zerstört sich das Objekt selber. 2.3 Server COM stellt sich als Client Server Architektur dar und besitzt drei Arten von Servern, InProg-, OutProg- und Remote. Der Client nutzt jeweils einen davon. InProg-Server Eine als InProg-Server geöffnete Variante, lädt die durch eine UID angeforderte Komponente in den Prozessraum der anfragenden Anwendung. Dort kann sie direkt über die Schnittstellen genutzt werden. Dies ist die schnellste der Varianten. Die Komponente selber liegt dabei als Dll im System registriert vor und kann daher von der COM Runtime Prozessraum Calculator.exe gefunden werden. Bei einem Fehler der IUnkown ISum Komponente besteht Client die Gefahr dass Calculator dieser auf die Anwendung IMultiply überspringt und diese beendet. CalculatorServer.dll Seite 4 Robert Berger Komponentenbasierte Softwareentwicklung 27.11.2006 OutProg-Server Der OutProg-Server stellt sein COM Objekt aus einem anderen Prozessraum der aufrufenden Anwendung zur Verfügung. Damit dies möglich ist und der Aufruf sich beim Client nicht von einem normalen InProg- Aufruf unterscheidet, findet dieser dazu in seinem Prozessraum ein Proxyobjekt, dass die gleichen Eigenschaften, wie das Original aufweist. Der Proxy kommuniziert über die COM Runtime mit dem zugehörigen Stub- Objekt, das auf der anderen Seite, im Prozessraum des Servers das COM-Objekt mit den Aufrufen vom Client bedient. Client Process Client Server Process ProxyObject StubObject COM Object Interprocess-Communication (COM Runtime / Windows) Remote-Server Der Remote Server ist der dritte im Bunde und ermöglicht die Kommunikation über Rechnergrenzen hinweg. Die Kommunikation erfolgt wie beim OutProgServer übe des Proxy Stub Muster. Zusätzlich jedoch überträgt der DCOM Dienst die Daten und Aufrufe über das TCP/IP Protokoll, auf das äquivalent am anderen Ende. Dies ist der langsamste aller Server, da er zusätzlich von der Netzwerklast und anderen Faktoren in seiner Ausführungsgeschwindigkeit beeinflusst wird. Alle Daten werden in einem Binärformat übertragen und erzeugen somit schon den geringsten Aufwand in der Übertragung. Der jeweilige Port muss bei einer Firewall freigegeben werden, da sonst keine Kommunikation möglich ist. Client Process Client Server Process ProxyObject Interprocess-Communication (COM Runtime / Windows) Seite 5 StubObject DCOM Network Protokoll COM Object Interprocess-Communication (COM Runtime / Windows) Robert Berger Komponentenbasierte Softwareentwicklung 27.11.2006 Jede für COM geschriebene Komponente kann als jede der drei Varianten aufgerufen werden. Der Aufruf dieser erfolgt beim Client mit der Initialisierung der COM Runtime über entsprechende Funktionen. Diesen muss mitgegeben werden, welche Servervariante zu nutzen ist. Dies kann aber nur geschehen, wenn die Dell in der Windows Registratur für alle drei Server registriert ist. 2.4 Schnittstellen Jedes COM Objekt ist mit dem COM Binärformat und der Runtime bestimmten Regeln unterworfen. Dazu zählen auch das jede definierte Schnittstelle vom Basisinterface „IUnknown“ abgeleitet werden muss. Dieses implementiert im Grunde den Reflection Mechanismus und regelt über zwei Methoden die Persistenz jedes Objektes. Für die Erstellung einer Binärdatei (Dll, Exec) ist eine weitere Schnittstelle notwendig, die eine Fabrik zur Generierung der Objekte ermöglicht. Diese wird später über die Befehle der Runtime gesteuert. Zur Registrierung der Binärdatei müssen aus dieser eine Anzahl vorgegebener Funktionen exportiert werden. Die Implementation eines kleinen COM Beispiel wäre mit diesen Anforderungen abgeschlossen. Für eine Erweiterung der Binärdatei sind zusammen mit den vorherigen Aufzählungen noch folgende Regeln zu erwähnen. 1. Jedes Interface muss IUnknown erweitern. 2. Jedes COM Objekt muss min. IUnknown und IClassFactory erweitern. 3. Die Definition der Schnittstellen muss mittels IDL erfolgen. 4. Die Binärdatei muss die aufgeführten Funktionen exportieren: ● ● ● ● DLLRegisterServer DLLUnregisterServer DLLGetClassObject DLLCanUnloadNow Natürlich wird für eine volle Funktionserklärung auf einschlägige Literatur verwiesen (Siehe Punkt 7). 2.5 Datentypen COM besitzt fest definierte Datentypen, diese werden als UNION über den Typ VARIANT dargestellt. Jener besitzt alle gängigen Typen, für die ein Standardwrapper existiert. Eine Übertragung ist somit ohne das nutzen des IMarshal Interface möglich. Die Allokierung von Speicher für jeweilige Datentypen ermöglichen Funktionen der COM Runtime. Somit ist es leicht auf Kosten der COM Runtime Speicher für eine Zeichenkette zu allozieren und wieder freizugeben. Seite 6 Robert Berger Komponentenbasierte Softwareentwicklung 27.11.2006 2.6 Programme Um COM Binärdateien zu registrieren, kann das Windows Werkzeug regsvr32.exe aufgerufen werden. Es ruft die exportierten Funktionen der Datei auf um den Server in der Registratur zu veröffentlichen. Ein zweites Werkzeug liefert die Visual Studio Umgebung. Die midl.exe steht für Microsoft IDL Generator dar und erzeugt aus er IDL Datei eine Binäre Typbibliothek, sowie verschiedene weitere Dateien zur Implementierung in die Sprache C++. Calculator_h.h C/C++ definitions Calculator_i.c GUIDs Calculator.idl midl.exe Calculator_p.c Proxy/Stub code dlldata.c Class loading support Calculator.tlb Binary descriptions Dateien zur direkten Implementierung des Client, Server in C++. Dateien für die Implementierung in anderen Sprachen. C++ Python .Net 3 Weiterführende Themen 3.1 ATL ATL steht für Active Template Library und stellt eine Bibliothek zur Erstellung von COM Objekten zur Verfügung. Mit Hilfe von Templates erfolgt die Nutzung, wie man es aus der C++ Standardbibliothek gewohnt ist. Hiermit werden viele negative Thematiken, die bei der Erstellung von COM Objekten auftreten, vermindert, oder verschwinden in den Funktionen der Templates. Dazu zählt z.B. die Abfrage der Rückgabewerte, welche nach jeder COM Operation abzufragen sind. Weiter wurde mit den Templats auch der Exception Handling Mechanismus eingeführt und vor allem eine bessere Implementation für Programmierer ermöglicht. Die Erstellung der eines ATL Server bzw. Client gestaltet sich durch die große Unterstützung des Visual Studio als sehr einfach. Entsprechende Beispiele werden unter Punkt 5.1 und 5.2 aufgezeigt. Mit der ATL Bibliothek erfolgt auch die Nutzung so genannter SmartPointer. Diese stellen Wrapper dar, mit deren Hilfe die Arbeit mit Schnittstellen erleichtert wird. SmartPointer können z.B direkt einem Interface zugewiesen werden, ohne dass irgendwelche Abfragen bezüglich der Möglichkeit überprüft werden. Seite 7 Robert Berger Komponentenbasierte Softwareentwicklung 27.11.2006 4 Zusammenspiel mit .NET (Interop) Das Microsoft .NET Framework ist so gestaltet, dass eine Interaktion mit vorhandenen COM Objekten vollständig möglich ist. Die Microsoft Bibliotheken, stellen sich bei näherer Betrachtung selber als COM Server dar und können in jeden unmanaged C++ Client oder anderen Sprachen als COM Server genutzt werden. Zur Einbettung vorhandener COM Server unter .NET, oder anders herum existieren Wapper, die die Kommunikation ermöglichen. Außerdem stellt Microsoft mit dem Visual Studio noch verschiedene Programme zur Auswahl, die bei der Integration helfen sollen. 4.1 Wrapper Es Existieren zwei Wrapper zur Kommunikation zwischen Client und Server. Der erste ermöglicht den Weg von unmanaged nach managed. Dies ist der RCW Wrapper. Das Äquivalent dazu stellt der CCW Wrapper dar, der den Weg von managed nach unmanaged offen legt. ● RCW Der „Runtime Callable Wrapper“ ermöglicht den Aufruf von COM-Objekten innerhalb der .NET Runtime. Für jedes COM Objekt wird ein neuer RCW erstellt. verwaltet nicht verwaltet IUnkown COMObjekt IDispatch RCW INew .NETClient INew ● Ein .NET-Client ruft einen COM Service auf. CCW Der „COM Callable Wrapper“ wird erzeugt, wenn ein COM Client einen .NET Typ aufruft. Es Existiert für jeden .NET Typ immer nur ein einziges Proxy Objekt, über das mehrere COM Clients zugreifen können. verwaltet nicht verwaltet IUnkown Ein COM-Client ruft einen .NET Service auf. Seite 8 IDispatch RCW INew .NET-Objekt COM-Client INew Robert Berger Komponentenbasierte Softwareentwicklung 27.11.2006 4.2 Programme Das Microsoft Visual Studio gibt dem Entwickler verschiedene Werkzeuge zur Hand, um die Interoperabilität so einfach wie möglich zu gestalten. ● Type Library Exporter-Tool (Tlbexp.exe) Das Tool erstellt aus Klassen und Schnittstellen, die in einer angegebenen Assembly liegen, eine COM-Typbibliothek. COM-Clients können damit .NET Klassen aufrufen. Dies ist notwendig, da nur Typbibliotheken mit einer „#import“ Anweisung in z.B. C++ referenziert werden können. ● Assembly-Registration-Tool (Regasm.exe) Das Tool generiert und registriert eine Typbibliothek für COM Clients. ● .NET Service Installation-Tool (Regsvcs.exe) Fügt verwaltete Klassen dem Windows 2000 COM Dienst hinzu. Die Daten werden Geladen, generiert und registriert. Es vereint also die beiden vorherigen Werkzeuge in einem. 5 Beispiele 5.1 ATL Server 1. Das neue ATL Projekt soll den Namen CalculcatorServer erhalten. 2. In der Auswahl sollte der Punkt DLL schon ausgewählt sein. 3. Folgende Übersicht sollte sich nach dem erstellen in der Klassenansicht wiederfinden. Seite 9 Robert Berger Komponentenbasierte Softwareentwicklung 27.11.2006 4. Über das Popupmenü des ersten Projektes muss es möglich sein nun eine neue Klasse anzulegen. 5. Nach der Auswahl eines einfachen ATL Objektes. 6. Ist man in der Lage diesem einen Namen zu geben. (Calculator). 7. Im nachfolgenden Fenster stellt man noch die Aggregation auf Nein. 8. Nun ist man in der Lage dem Interface Calculator, welches mit der Klasse erstellt wurde eine neue Methode hinzuzufügen. 9. Nach dem Ausfüllen der Übergabeparameter... 10. Kann man dann die Methodenimplementation in der Klasse ausfüllen. STDMETHODIMP CCalculator::Sum(long value1, long value2, long* retval) { *retval = value1 + value2 return S_OK; } 11. Nach erfolgreicher Kompilation steht der Server dann zur Verfügung. Seite 10 Robert Berger Komponentenbasierte Softwareentwicklung 27.11.2006 5.2 ATL Client Um einen ATL Client zu erstellen muss eine Windows Konsolenanwendung erstellt werden. Es ist wichtig, dass diese für die Nutzung der ATL Bibliothek markiert wird. Um nach dem Kopieren der CalculationServerCpp.tlb Datei in das Projektverzeichnis diese in das Projekt einzubinden, fügt man der stdafx.h folgende Einträge hinzu. #import "CalculatorServerCpp.tlb" raw_interfaces_only using namespace CalculatorServerCppLib; WICHTIG: Die TLB Datei, welches die Typbibliothek darstellt, muss der Anwendung zugänglich sein, da dort alle Schnittstellen definiert sind. Nun kann die ClientCpp.cpp Datei folgenden Inhalt erhalten: int _tmain(int argc, _TCHAR* argv[]) { printf("Press any key to connect to COM Runtime. [KEY]"); getchar(); //-- Open COM Runtime HRESULT hr = CoInitialize(NULL); if(SUCCEEDED(hr)) //-- Check if Runtime could be open. { try { //-- Create new Smartpointer from Type ICalculator ICalculatorPtr pointer(__uuidof(Calculator)); //-- Use functionality long result = pointer->Sum(10, 20); printf("The operation was: 10 + 20 = %d result); getchar(); } \n[KEY]", } catch(...) //-- Catch possible COM errors { printf("COM Error"); } //-- Uninitialize COM CoUninitialize(); printf("COM Runtime unloaded [KEY]"); getchar(); return 0; } Seite 11 Robert Berger Komponentenbasierte Softwareentwicklung 27.11.2006 5.3 .NET Client Der C' Client benötigt zur Nutzung der COM Schnittstelle eine Referenz auf die Typbibliothek des CalculatorServerCPP. Diese ist über den Punkt References auszuwählen. Nach dem hinzufügen, kann der COM Calculator Server so genutzt werden, wie ein normales C# Objekt. using using using using System; System.Collections.Generic; System.Text; CalculatorServerCppLib; namespace ClientCSharp { class Program { static void Main(string[] args) { ICalculator pCalc = new CalculatorClass(); long result = pCalc.Sum(10, 20); Console.WriteLine("The operation was: 10 + 20 = " + result + " \n[KEY]"); Console.ReadKey(); } } } 5.4 .NET Server Die Implementierung des C# Servers erfolgt mit der gleichen COM Struktur, wie beim ATL Server, jedoch ist diese über die Attributierungen der Klassen und deren Schnittstellen definiert. Das Projekt „CalculatorServerCSharp“ muss gebaut werden. In den Post-Build-Steps liegen Befehle, die die tlbexp.exe Datei nutzen, um eine TLB Datei zu erstellen und die Typen in der Windows Registratur zu registrieren. Mit dem gacutil.exe Werkzeug wird die Assembly im Global Assembly Cache publiziert. Im Anschluss kann der CSClient aufgerufen werden. Dieser stellt einen nativen COM Client dar, der auf den .NET Server zugreift. Seite 12 Robert Berger Komponentenbasierte Softwareentwicklung 27.11.2006 using System; using System.Runtime.InteropServices; namespace CalculatorServerCSharp { [ComVisible(true)] [InterfaceType(ComInterfaceType.InterfaceIsDual)] [Guid("C74C22CF-3B2A-481a-BA58-4D7A3BF10C0C")] public interface ICalculatorCS { [DispId(1)] int Sum(long value1, long value2, out long result); } [ComVisible(true)] [ComSourceInterfaces(typeof(ICalculatorCS))] [Guid("B0306A05-38CD-4c3c-8102-8DDA20E0A9FD")] [ClassInterface(ClassInterfaceType.AutoDual)] public class CalculatorCSharp : ICalculatorCS { public CalculatorCSharp() { } public int Sum(long value1, long value2, out long result) { result = value1 + value2; return 0; } } } 5.5 Überblick CalculatorServer ● CalculatorServerCpp COM Server (CPP) ● CalculatorServerCSharp COM Server (.NET C#) ● CSClient COM Client (CPP to .NET) ClientCPP Seite 13 Server Beispiele Client Beispiele ● ClientCPP COM Client ( CPP[ATL] to COM [CPP] ) ● ClientCPP2 COM Client ( CPP[no ATL] to COM [CPP] ) ● ClientCSharp COM Client ( .NET[C#] to COM [CPP] ) Robert Berger Komponentenbasierte Softwareentwicklung 27.11.2006 6 Fazit COM ist ein Ausgereiftes komponentenbasiertes Objektmodell welches seit 1995 die komponentenbasierte Entwicklung unter dem Windows Betriebssystem definiert. Punkte die für COM sprechen sind eindeutig Performance Gründe, da das COM Objektmodell mit seiner InProg-Server Variante äußerst schnell ist. Auch die Remote Variante, steht in Sachen wie Geschwindigkeit sehr weit vorne, jedoch mit dem Nachteil das dafür gewollte Verbindungen hergestellt werden müssen, da ein RemoteServer nicht durch eine aktive Firewall verbunden werden kann. Mit der Kompatibilität zum .NET Framework ist es möglich vorhandene Software in neue Komponenten einzubinden, sowie alte zu portieren. Vor allem mit dem Gesichtspunkt, dass Technologien, wie ActiveX oder COM+ ja auf dem COM Modell basieren. Für eine Migration auf das .NET Framework von COM Komponenten steht also nichts im Weg. Ebenso wie die damit verbundene Attraktivität neue COM Komponenten zu erstellen mit dem Wissen, dass diese auch für das .NET Framework genutzt werden könne. Nachteile von COM sind eindeutig sein Komplexität, sowie die schwierige Einarbeitung in das Themengebiet. Ein erfahrenen COM Programmierer benötigt ungefähr 2 Jahre um alle Themengebiete einmal professionell genutzt zu haben. Mit Hilfe der ATL Technologie ist die Implementierung unter C++ wesentlich erleichtert wurden, was für COM eine zunehmende Attraktivität darstellt. Was die Migration von COM Komponenten nach .NET betrifft, stehe ich dieser kritisch gegenüber, da erstens die Firmen kein Geld in Projekte stecken werden aus denen sie nur geringfügigen nutzen ziehen. Da vor allem die Interoperabilität sich so einfach gestaltet. Ich denke viel mehr wird man .NET Wrapper sehen, welche nur vorhandene COM Objekte nutzen. Seite 14 Robert Berger Komponentenbasierte Softwareentwicklung 27.11.2006 7 Quellen ● GoTo COM, Peter Loos, Addison Wesley, 2001 (ISBN 3-8273-1678-2) ● Interop: ○ Advanced COM Interoperability (http://msdn2.microsoft.com/en-us/library/bd9cdfyx.aspx) ○ Exposing COM Components to the .NET Framework (http://msdn2.microsoft.com/en-us/library/z6tx9dw3.aspx) ○ Exposing .NET Framework Components to COM (http://msdn2.microsoft.com/en-us/library/zsfww439.aspx) ○ Using the .NET Framework SDK Interoperability Tools (http://msdn2.microsoft.com/en-us/library/aa302324.aspx) ● Microsoft ATL Reference (http://msdn.microsoft.com/library/default.asp?url=/library/enus/vccore/html/_atl_ATL_Article_Overview.asp) 8 Literatur In der Bibliothek vorhandene Bücher ● Konstruktion von Verteilten Objekten, Punkt Verlag [TXG 118 125] (COM, DCOM, CORBA, ...) ● MFC mit Visual C++ 6.0, mitp Verlag [TXE 111 406] (COM, ATL, COM, ...) Empfohlene Bücher zu COM ● Internals, Brent Rector an Chris Sells ● Inside ATL, George Shepherd and Brad King Empfohlene Bücher zu ATL ● Inside Distributed COM, Henry and Guy Eddon ● Essential IDL, Marin Gudgin ● Effective COM, Don Box, Keith Brown, Tim Ewald, Chris Sells Freie eBooks ● Seite 15 http://www.apress.com/free/download_free.html Robert Berger