Komponentenobjektmodell
Komponentenobjektmodell | |
Abkürzung | Com |
---|---|
Status | In voller Stärke |
Erstmals veröffentlicht | 1993 |
Letzte Version | Lebensstandard 2021 |
Organisation | Microsoft |
Serie | Systemdienste |
Grundstandards | Midl, Uuid |
Verwandte Standards |
|
Domain | Komponenten -Schnittstellen |
Webseite | Dokumente |
Komponentenobjektmodell (Com) ist ein Binärerdiener Standard für Softwarekomponenten Vorgestellt von Microsoft 1993. Es wird verwendet, um zu aktivieren Interprozesskommunikation Objekt Schöpfung in einer großen Auswahl an Programmiersprachen. Com ist die Grundlage für mehrere andere Microsoft Technologies und Frameworks, einschließlich Ole, Oale Automatisierung, Browser -Helferobjekt, ActiveX, Com+, DCOM, das Windows Shell, DirectX, Umdf und Windows -Laufzeit. Die Essenz von COM ist eine sprachneutrale Methode, um Objekte zu implementieren, die in Umgebungen verwendet werden können, die sich von derjenigen unterscheiden, in der sie geschaffen wurden, sogar über Maschinengrenzen. Für gut ausgefeilte Komponenten ermöglicht COM die Wiederverwendung von Objekten ohne Kenntnis ihrer internen Implementierung, da es Komponenten-Implementierer dazu zwingt, genau definiert zu sein Schnittstellen die von der Implementierung getrennt sind. Die unterschiedliche Zuteilungssemantik von Sprachen wird untergebracht, indem Objekte für ihre eigene Schöpfung und Zerstörung durch die Verantwortung als Verantwortung durchführen Referenzabzehnung. Geben Sie Conversion Casting ein zwischen verschiedenen Schnittstellen eines Objekts wird durch die erreicht Abfrageinterface
Methode. Die bevorzugte Methode der "Vererbung" innerhalb von COM ist die Erstellung von Unterobjekten, an die "Aufrufe" delegiert werden.
Com ist eine Schnittstellentechnologie, die nur auf Standard definiert und implementiert wird Microsoft Windows und Apple Kernfundament 1.3 und später Plug-In Programmierschnittstelle (API).[1] Letzteres implementiert nur eine Teilmenge der gesamten COM -Schnittstelle.[2] Für einige Anwendungen wurde COM zumindest in gewissem Maße durch die ersetzt Microsoft .net Rahmen und Unterstützung für Internetdienste durch die Windows Communication Foundation (WCF). COM -Objekte können jedoch mit allen .NET -Sprachen über .NET verwendet werden Com interop. Networked dcom verwendet binär Eigentumsformate, während WCF die Verwendung von fördert Xml-basierend SEIFE Nachrichten. Com ist anderen sehr ähnlich Komponentensoftware Schnittstellentechnologien wie z. Corba und Enterprise Javabeans, obwohl jeder seine eigenen Stärken und Schwächen hat. Im Gegensatz zu C ++ bietet COM einen stabilen Anwendung Binärschnittstelle (ABI) Das ändert sich nicht zwischen Compiler -Releases.[3] Dies macht COM-Schnittstellen für objektorientierte C ++-Bibliotheken attraktiv, die von Clients verwendet werden sollen, die mit verschiedenen Compiler-Versionen kompiliert werden.
Geschichte
Eine der ersten Methoden von Interprozesskommunikation in Windows war Dynamischer Datenaustausch (DDE),[4] erstmals 1987 eingeführt,[5] Dies ermöglichte das Senden und Empfangen von Nachrichten in sogenannten "Gesprächen" zwischen Anwendungen. Antony Williams, der an der Schaffung der COM -Architektur beteiligt war, verteilte später zwei interne Papiere in Microsoft, die das Konzept von Softwarekomponenten umfassten: Objektarchitektur: Umgang mit dem unbekannten - oder - - Type -Sicherheit in einer dynamisch erweiterbaren Klassenbibliothek 1988 und Auf Vererbung: Was es bedeutet und wie man es benutzt im Jahr 1990. Diese bildeten die Grundlage vieler Ideen hinter Com. Objektverbindung und Einbettung (OLE), Microsofts erstes objektbasiertes Framework, wurde auf DDE aufgebaut und speziell für entwickelt zusammengesetzte Dokumente. Es wurde mit vorgestellt mit Wort für Windows und Excel 1991 und wurde später in Windows enthalten, beginnend mit Version 3.1 im Jahr 1992. Ein Beispiel für ein zusammengesetztes Dokument ist a Kalkulationstabelle Eingebettet in ein Wort für Windows -Dokument: Wenn Änderungen an der Tabelle in Excel vorgenommen werden, werden sie automatisch im Wort -Dokument angezeigt.
Im Jahr 1991 führte Microsoft ein Visuelle grundlegende Erweiterungen (VBX) mit Visual Basic 1.0. Ein VBX ist eine verpackte Erweiterung in Form von a Dynamische Link Bibliothek (DLL), mit dem Objekte grafisch in Form platziert und durch manipuliert werden können Eigenschaften und Methoden. Diese wurden später für andere Sprachen angepasst, z. Visuell c ++. Im Jahr 1992, als Version 3.1 von Fenstern wurde veröffentlicht, Microsoft veröffentlichte Ole 2 mit seinem zugrunde liegenden Objektmodell. Der com Anwendung Binärschnittstelle (ABI) war der gleiche wie der Mapi Abi (veröffentlicht 1992) und wie es auf MSRPC und letztendlich auf der Offene Gruppe's DCE/RPC. Während Ole 1 auf zusammengesetzte Dokumente konzentrierte, wurden COM und Ole 2 so konzipiert, dass sie Softwarekomponenten im Allgemeinen behandeln. Textgespräche und Windows -Nachrichten hatten sich als nicht flexibel genug erwiesen, um die Freigabe von Anwendungsfunktionen auf eine robuste und erweiterbare Weise zu ermöglichen, sodass COM als neues Fundament erstellt wurde und Ole in Ole2 geändert wurde. 1994 Oale benutzerdefinierte Steuerelemente (OCXS) wurden als Nachfolger der VBX -Kontrollen eingeführt. Gleichzeitig erklärte Microsoft, dass Ole 2 nur als "Ole" bekannt sein würde und dass Ole kein Akronym mehr war, sondern ein Name für alle Komponententechnologien des Unternehmens. Anfang 1996 fand Microsoft eine neue Verwendung für Ole Custom Controls und erweiterte die Fähigkeit ihres Webbrowsers, Inhalte zu präsentieren, und benannte einige Teile von OLE in Bezug auf die um Internet "ActiveX", und wurde nach und nach alle OLE -Technologien in ActiveX umbenannt, mit Ausnahme der zusammengesetzten Dokumenttechnologie, die in verwendet wurde Microsoft Office. Später in diesem Jahr erweiterte Microsoft COM, um im Netzwerk im Netzwerk zu arbeiten DCOM.[6]
Verwandte Technologien
COM war die wichtigste Softwareentwicklungsplattform für Windows und beeinflusste als solche die Entwicklung einer Reihe von unterstützenden Technologien. Es wurde ebenfalls stark von früheren Technologien beeinflusst.
Dde
Com ersetzt Dde als bevorzugte Form der Interprozesskommunikation.
DCE/RPC und MSRPC
Als Cross-Language-Komponentenmodell stützt sich COM auf eine Schnittstellendefinitionssprache oder IDL, um die Objekte und zugehörigen Funktionen zu beschreiben. Das COM IDL basiert stark auf dem featurereichen DCE/RPC-IDL mit objektorientierten Erweiterungen. Die eigene Implementierung von DCE/RPC durch Microsoft, bekannt als MSRPC, wird stark als primärer Kommunikationsmechanismus für Windows-NT-Dienste und interne Komponenten verwendet, wodurch es zu einer offensichtlichen Wahl der Grundlage wird.
DCOM
Dcom (Verteilt com) erweiterte die Reichweite von COM von der bloßen Unterstützung eines einzelnen Benutzer mit separaten Anwendungen, die auf dem Windows -Desktop kommunizieren, auf Aktivierung von Objekten, die unter verschiedenen Sicherheitskontexten ausgeführt werden, und auf verschiedenen Maschinen im Netzwerk. Mit diesem fügten die erforderlichen Funktionen für die Konfiguration, welche Benutzer die Berechtigung zum Erstellen, Aktivieren und Aufrufen von Objekten haben, um den aufrufenden Benutzer zu erstellen, zu aktivieren und aufzurufen, sowie die erforderliche Verschlüsselung für die Sicherheit von Anrufen anzugeben.
Com+
Damit Microsoft Entwicklern Unterstützung für die Unterstützung für verteilte Transaktionen, Ressourcenpooling, getrennte Anwendungen, Ereignisveröffentlichungen und Abonnements, bessere Speicher- und Prozessorverwaltung (Thread) sowie für die Position von Windows als Alternative zu anderen Betriebssystemen auf Unternehmensebene. Microsoft führte eine Technologie namens namens ein Microsoft Transaction Server (MTS) unter Windows NT 4. Mit Windows 2000 wurde diese erhebliche Erweiterung der COM in das Betriebssystem aufgenommen (im Gegensatz zu der Reihe externer Tools von MTS) und umbenannt Com+. Gleichzeitig wurde Microsoft unterbaut DCOM als separate Einheit. Komponenten, die COM+ -Dienste nutzten, wurden direkter von der zusätzlichen COM+ -Schicht, insbesondere durch die Unterstützung des Betriebssystems für Abfangen gehandhabt. In der ersten Veröffentlichung von MTS wurde das Interception angegriffen - die Installation einer MTS -Komponente würde das ändern Windows -Registrierung Um die MTS -Software aufzurufen, und nicht die Komponente direkt. Windows 2000 überarbeitete auch die Anwendung "COMPLEENT Services Control Panel", die zum Konfigurieren von COM+ -Komponenten verwendet wurde.
Ein Vorteil von Com+ war, dass es in "Komponentenfarmen" betrieben werden konnte. Instanzen einer Komponente können, wenn sie ordnungsgemäß codiert werden, durch neue Aufrufe der Initialisierungsroutine zusammengefasst und wiederverwendet werden, ohne sie aus dem Speicher zu entladen. Komponenten könnten auch verteilt werden (von einer anderen Maschine genannt). Com+ und Microsoft Visual Studio Bereitstellung von Tools, mit denen die kundenseitigen Proxys generiert werden können. Obwohl DCOM verwendet wurde, um den Remote-Anruf zu tätigen, war es für Entwickler einfach. COM+ führte auch einen Ereignismechanismus für Abonnenten/Publisher ein namens namens Com+ Ereignisseund bot eine neue Art der Nutzung MSMQ (Eine Technologie, die asynchrone Messaging zwischen den Anwendungen liefert) mit Komponenten genannt Komponenten in der Warteschlange. COM+ Ereignisse erweitern das COM+ -Programmmodell, um spät gebunden zu werden (siehe Späte Bindung) Ereignisse oder Methodenaufrufe zwischen dem Verlag oder Abonnenten und dem Ereignissystem.
.NETZ
Microsoft .NET bietet sowohl Mittel für die Bereitstellung von Komponententechnologie als auch die Interaktion mit COM+ (über COM-Interop-Assemblys). .NET bietet Verpackungen für die meisten der häufig verwendeten COM -Steuerelemente. Microsoft .NET verbirgt die meisten Details vor der Erstellung von Komponenten und erleichtert daher die Entwicklung. .NET kann COM+ über das System nutzen. ENGERPRISSEVICES -Namespace, und einige der Dienste, die COM+ erbringt, wurden in den jüngsten Veröffentlichungen von .NET dupliziert. Beispielsweise bietet das system.transactions namespace in .NET die TransactionsCope -Klasse, die Transaktionsmanagement bietet, ohne auf COM+zurückzugreifen. Ähnlich, Komponenten in der Warteschlange kann durch ersetzt werden durch Windows Communication Foundation mit einem MSMQ Transport. (MSMQ ist jedoch eine native COM -Komponente.) Die Rückwärtskompatibilität wird nur begrenzt unterstützt. Ein COM -Objekt kann in .NET verwendet werden, indem a implementiert werden Laufzeit Callable Wrapper (RCW).[7] Nettoobjekte, die bestimmten Schnittstellenbeschränkungen entsprechen Com Callable Wrapper (CCW).[8] Sowohl von den COM- als auch von .NET -Seiten erscheinen Objekte, die die andere Technologie verwenden, als native Objekte. Sehen Com interop.WCF (Windows Communication Foundation) erleichtert eine Reihe von COM -Herausforderungen der Remote -Ausführung. Zum Beispiel ermöglicht es den Objekten, durch den Wert über den Wert über die Prozesse oder Maschinengrenzen hinweg gilt, einfach einfacher.
Windows -Laufzeit
Die Windows Runtime von Microsoft (oder WinRT, nicht verwechselt werden Windows Rt) Programmier- und Anwendungsmodell ist im Wesentlichen eine COM-basierte API, obwohl es auf einem erweiterten COM beruht. Aufgrund seiner COM-ähnlichen Basis ermöglicht Windows Runtime eine relativ einfache Verbindung von mehreren Sprachen, genau wie COM, aber es handelt sich im Wesentlichen um eine nicht verwaltete, native API. Die API -Definitionen werden jedoch in ".winmd" -Dateien gespeichert, die im ECMA 335 -Metadatenformat codiert sind, dasselbe CLI -Metadaten Format, das .NET mit einigen Änderungen verwendet. Dieses gemeinsame Metadatenformat ermöglicht erheblich weniger Overhead als P/Invoke, wenn WinRT aus .NET -Anwendungen aufgerufen wird, und seine Syntax ist viel einfacher.
Nano-Com (a.k.a xpcom)
Nano-COM ist eine extrem kleine Teilmenge des Komponentenobjektmodells, das ausschließlich auf die Aspekte der Anwendung Binary Interface (ABI) von COM auf diese Aktivierungsfunktions- und Methodenaufrufe hinweg über unabhängig kompilierte Module/Komponenten ausgerichtet ist. Nano-COM kann leicht in einer einzelnen C ++-Header-Datei ausgedrückt werden, die für alle C ++-Compiler tragbar ist. Nano-COM erweitert den nativen ABI der zugrunde liegenden Anweisungsarchitektur und das Betriebssystem, um typisierte Objektreferenzen zu unterstützen (typischer ABIS-Fokus konzentrieren sich nur auf Atomtypen, Strukturen, Arrays und Funktionen, die Konventionen aufrufen). Die Grundlage von Nanokom XPCOM) und wird derzeit als Basis -ABI -Technologie für verwendet DirectX/Direct3d/DirectMl.
Eine Nano-Com-Header-Datei definiert oder nennt mindestens drei Typen:
- Guid zur Identifizierung von Schnittstellentypen - dies ist effektiv eine 128 -Bit -Nummer
- HRESULT, um Fehlercodes aus Methodenaufrufen zu identifizieren - dies ist effektiv eine standardisierte Verwendung von 32 -Bit -INTs zu bekannten Werten (S_OK, E_FAIL, E_OUTOFMEMORY usw.)
- IUKNNOWN als Basistyp für alle typisierten Objektreferenzen - dies sind effektiv abstrakte virtuelle Funktionen zur Unterstützung
Dynamic_cast
-Stilakquisition neuer Schnittstellentypen und Ref Counting A LAShared_ptr
Viele Verwendungen von Nanokom
Alloc – called by method implementations to allocate raw buffers (not objects) that are returned to the caller Free – called by method callers to free callee-allocated buffers once no longer in use
Einige Implementierungen von Nano-COM wie Direct3d vermeiden die Allocator-Funktionen und beschränken sich nur, nur auf Anrufer zugezogene Puffer zu verwenden.
Nano-COM hat keine Vorstellung von Klassen, Wohnungen, Marschagen, Registrierung usw. Vielmehr werden Objektreferenzen einfach über Funktionsgrenzen hinweg übergeben und über Standardsprachkonstrukte (z. B. C ++-neuer Operator) zugewiesen.
Sicherheit
COM- und ActiveX -Komponenten werden als natives Code auf der Maschine des Benutzers ohne Sandboxen ausgeführt. Es gibt daher nur wenige Einschränkungen, was der Code tun kann. Die vorherige Praxis, aktivex -Komponenten in Webseiten einzubetten, mit Internet Explorer hat daher zu Problemen mit geführt Malware Infektionen. Microsoft erkannte das Problem mit ActiveX bereits 1996, als Charles Fitzgerald sagte: "Wir haben die Behauptung nie vorne, dass ActiveX intrinsisch sicher ist."[9] Jüngste[wenn?] Versionen von Internet Explorer fordern den Benutzer vor der Installation von ActiveX -Steuerelementen auf, sodass der Benutzer die Installation von Steuerelementen von Websites, denen der Benutzer nicht vertraut, nicht zulassen kann. Die ActiveX -Steuerelemente sind unterzeichnet mit digitale Signaturen ihre Authentizität garantieren. Es ist auch möglich, ActiveX -Steuerelemente insgesamt zu deaktivieren oder nur wenige ausgewählte zuzulassen. Die transparente Unterstützung für COM-Server außerhalb des Prozesses fördert die Software-Sicherheit in Bezug auf Prozessisolation. Dies kann nützlich sein, um Subsysteme großer Anwendung in getrennte Prozesse zu entkoppeln. Die Prozessisolationsgrenze begrenzt die Korruption des Zustands in einem Prozess, wenn sie die Integrität der anderen Prozesse negativ beeinflussen, da sie nur durch streng definierte Schnittstellen kommunizieren. Somit muss nur das betroffene Subsystem neu gestartet werden, um den gültigen Zustand wiederzugewinnen. Dies ist bei Subsystemen innerhalb desselben Prozesses nicht der Fall, wobei a Schurkenzeiger In einem Subsystem kann andere Subsysteme zufällig korrupten.
Technische Details
COM-Programmierer erstellen ihre Software mit dem Namen Komponenten. Verschiedene Komponententypen werden durch Klassen -IDs (CLSIDs) identifiziert, die sind Global einzigartige Kennungen (Guids). Jede COM -Komponente enthüllt ihre Funktionalität durch einen oder mehrere Schnittstellen. Die verschiedenen Schnittstellen, die von einer Komponente unterstützt werden, unterscheiden sich voneinander unter Verwendung von Schnittstellen -IDs (IIDs), die ebenfalls GUIDs sind. COM -Schnittstellen haben Bindungen in mehreren Sprachen, wie z. C, C ++, Visual Basic, Delphi, Python[10][11] und einige der auf der Windows -Plattform implementierten Skriptsprachen. Alle Zugriff auf Komponenten erfolgen über die Methoden der Schnittstellen. Dies ermöglicht Techniken wie Interprozess oder sogar Inter-Computer-Programmierung (letztere unter Verwendung der Unterstützung von DCOM).
Schnittstellen
Alle COM -Komponenten implementieren die IUKNNOWN (Brauch) Schnittstelle, die Methoden für die Enthüllung für Referenzzählung und Typumwandlung Typ (Casting). EIN Brauch Die IUKNNOWN -Schnittstelle besteht aus einem Zeiger auf a Virtuelle Methode Tabelle Das enthält eine Liste von Zeigern auf die Funktionen, die die in der Schnittstelle deklarierten Funktionen implementieren, in derselben Reihenfolge, die sie in der Schnittstelle deklariert werden. Der Overhead für In-Process-Aufrufe ist daher vergleichbar mit virtuellen Methodenaufrufen in C ++. Zusätzlich zu Brauch Schnittstellen, COM auch unterstützt versenden Schnittstellen von Idispatch. Versand -Schnittstellenunterstützung späte Bindung zum Oale Automatisierung. Dies erlaubt versenden Schnittstellen, die nativ von einem breiteren Bereich von Programmiersprachen zugreifen können als Brauch Schnittstellen.
Klassen
Eine COM -Klasse ("Coclass") ist eine konkrete Implementierung eines oder mehrerer Schnittstellen und ähnelt sehr Klassen in Objekt orientierte Programmierung Sprachen. Klassen werden basierend auf ihrer Klassen -ID erstellt (Clsid) oder basierend auf ihrer programmatischen Kennung Zeichenfolge (Progid). Wie viele objektorientierte Sprachen bietet COM eine Trennung der Schnittstelle von der Implementierung. Diese Unterscheidung ist besonders stark in COM, wo Objekte nicht direkt zugegriffen werden können, sondern nur über ihre Schnittstellen. COM hat auch Unterstützung für mehrere Implementierungen derselben Schnittstelle, so dass Clients bei Laufzeit Kann auswählen, welche Implementierung einer Schnittstelle zum Instanziieren ist.
Schnittstellendefinition Sprache und Typen Bibliotheken
Typ -Bibliotheken enthalten Metadaten, um COM -Typen darzustellen. Diese Typen werden mit Verwendung beschrieben Microsoft Interface Definitionssprache (MSIDL/IDL). IDL-Dateien definieren objektorientierte Klassen, Schnittstellen, Strukturen, Aufzählungen und andere benutzerdefinierte Typen auf sprachunabhängige Weise. IDL ist im Erscheinungsbild von C ++ - Deklarationen mit einigen zusätzlichen Schlüsselwörtern wie "Schnittstelle" und "Bibliothek" für die Definition von Schnittstellen und Klassensammlungen ähnlich. IDL unterstützt auch die Verwendung von Klammerattributen vor Deklarationen, um zusätzliche Informationen zu liefern, z. B. Schnittstellenrichtlinien und die Beziehungen zwischen Zeigerparametern und Längenfeldern. IDL -Dateien werden von der MIDL zusammengestellt Compiler. Für C/C ++ generiert der MIDL-Compiler eine Compiler-unabhängige Header-Datei, die Strukturdefinitionen enthält, die dem entspricht, der dem entspricht. VTBLS der deklarierten Schnittstellen und einer C -Datei, die Deklarationen der Schnittstelle enthält Guids. Der C ++ - Quellcode für ein Proxy -Modul kann auch vom MIDL -Compiler generiert werden. Dieser Proxy enthält Methodenstubs für das Konvertieren von COM -Aufrufen in Remote -Verfahrensanrufe DCOM für die Kommunikation außerhalb der Prozesse zu aktivieren. IDL -Dateien können auch vom MIDL -Compiler in eine Typbibliothek (TLB) zusammengestellt werden. TLB-Dateien enthalten binäre Metadaten, die von verschiedenen Sprach Compilern und Laufzeitumgebungen (z. B. VB, Delphi, .NET usw.) verarbeitet werden können, um sprachspezifische Konstrukte zu generieren, um die in der TLB definierten COM-Typen darzustellen. Für C ++ konvertiert dies die TLB zurück in seine IDL -Darstellung.
Objekt Framework
Da COM ein Laufzeit -Framework ist, müssen die Typen zur Laufzeit individuell identifizierbar und spezifizierbar sein. Um das zu erreichen, Global einzigartige Kennungen (Guids) werden verwendet. Jeder COM -Typ wird zur Laufzeit als eigene GUID für die Identifizierung bezeichnet. Damit Informationen zu COM -Typen sowohl zur Kompilierzeit als auch zur Laufzeit zugänglich sind, verwendet COM Typenbibliotheken. Es ist durch den effektiven Einsatz von Geben Sie Bibliotheken ein Dass COM seine Fähigkeiten als dynamisches Framework für die Interaktion von Objekten erreicht.
Betrachten Sie das folgende Beispiel für die Coclass -Definition in einem IDL:
coclass someclass {[Standard] Schnittstelle isomeInterface; };
Das obige Code -Fragment deklariert eine COM -Klasse mit dem Namen Someclass
Dies implementiert eine Schnittstelle mit dem Namen IsomeInterface
.
Dies entspricht konzeptionell der Definition der folgenden C ++ - Klasse:
Klasse Someclass : Öffentlichkeit IsomeInterface { ... ... };
Wo isomeInterface ist ein C ++ - reine virtuelle Klasse (manchmal als abstrakte Basisklasse bezeichnet).
Die IDL -Dateien mit COM -Schnittstellen und Klassen werden in TLB -Dateien (Type Libraries) zusammengestellt, die später zur Laufzeit von Clients analysiert werden können, um zu bestimmen, welche Schnittstellen ein Objekt unterstützt, und die Schnittstellenmethoden eines Objekts aufrufen.
In C ++ werden COM -Objekte mit dem instanziiert Cocrreateinstance
Funktion, die die Klassen -ID (CLSID) und die Schnittstellen -ID (IID) als Argumente nimmt. Instanziierung von Someclass
kann wie folgt implementiert werden:
IsomeInterface* interface_ptr = NULL; Hresult HR = Cocrreateinstance(CLSID_SOMECLASS, NULL, CLSCTX_ALL, Iid_isomeInterface, (Leere**)&interface_ptr);
In diesem Beispiel wird das COM-Subsystem verwendet, um einen Zeiger auf ein Objekt zu erhalten, das implementiert IsomeInterface
Schnittstellen- und Coclass -CLSID_SOMECLASS -Implementierung dieser Schnittstelle ist erforderlich.
Referenzzählung
Alle COM -Objekte verwenden Referenzzählung Objektlebensdauer zu verwalten. Die Referenzzahlen werden von den Clients über die gesteuert Addref und Veröffentlichung Methoden in der obligatorischen IunkNown -Schnittstelle, die alle COM -Objekte implementieren. COM -Objekte sind dann dafür verantwortlich, ihren eigenen Speicher zu befreien, wenn die Referenzzahl auf Null fällt. Bestimmte Sprachen (z. Visual Basic) Geben Sie eine automatische Referenzzählung an, damit COM -Objektentwickler einen internen Referenzzähler in ihren Quellcodes nicht explizit verwalten müssen. In C ++ kann ein Codierer entweder eine explizite Referenzzählung durchführen oder verwenden Smart Zeiger Um die Referenzzählungen automatisch zu verwalten.
Im Folgenden sind Richtlinien für den Anruf aufgeführt Addref und Veröffentlichung auf com -Objekten:
- Funktionen und Methoden, die Schnittstellenreferenzen zurückgeben (über den Rückgabewert oder über "Out" -Parameter), müssen die Referenzzahl des zurückgegebenen Objekts vor der Rückkehr erhöht.
- Veröffentlichung Muss auf einen Schnittstellenzeiger aufgerufen werden, bevor der Zeiger überschrieben wird oder aus dem Zielfernrohr geht.
- Wenn eine Kopie auf einem Schnittstellenreferenzzeiger erstellt wird, Addref sollte diesen Zeiger angerufen werden.
- Addref und Veröffentlichung muss auf die spezifische Schnittstelle aufgerufen werden, auf die referenziert wird, da ein Objekt referenzieren kann, um interne Ressourcen nur für die referenzierten Schnittstellen zuzuweisen.
Nicht alle Referenzzählanrufe werden an Remote -Objekte über den Kabel gesendet. Ein Proxy führt nur eine Referenz auf das Remote -Objekt und führt seine eigene lokale Referenzzahl bei. Um die COM -Entwicklung zu vereinfachen, hat Microsoft eingeführt ATL (Active Template Library) Für C ++ - Entwickler. ATL sorgt für ein COM-Entwicklungsparadigma auf höherer Ebene. Es schenkt auch COM -Client -Anwendungsentwickler vor der direkten Aufrechterhaltung der Referenzzählung durch Bereitstellung Smart Zeiger Objekte. Andere Bibliotheken und Sprachen, die sich bewusst sind Microsoft Foundation -Kurse, das VC Compiler Com Support,[12] Vbscript, Visual Basic, ECMaskript (JavaScript) und Borland Delphi.
Programmierung
Com ist a Sprache agnostisch Binärer Standard, der in jeder Programmiersprache entwickelt werden kann, die ihre binären definierten Datentypen und Schnittstellen verstehen und implementieren kann. COM-Implementierungen sind dafür verantwortlich, die COM-Umgebung einzugeben und zu verlassen, COM-Objekte zu instanziieren und zu referenzieren, Objekte für unterstützte Schnittstellen sowie Handhabungsfehler abzufragen. Der Microsoft Visual C ++ - Compiler unterstützt Erweiterungen an der C ++ Sprache bezeichnet als als C ++ Attribute.[13] Diese Erweiterungen sollen die COM -Entwicklung vereinfachen und vieles entfernen Boilerplate -Code erforderlich, um COM -Server in C ++ zu implementieren.[14]
Registrierungsnutzung
In Windows werden COM -Klassen, Schnittstellen und Typbibliotheken durch GUIDs in der aufgeführt Registrierung, unter Hkey_classes_root \ clsid für Klassen und Hkey_classes_root \ interface Für Schnittstellen. COM -Bibliotheken verwenden die Registrierung, um entweder die richtigen lokalen Bibliotheken für jedes COM -Objekt oder den Netzwerkstandort für einen Remote -Dienst zu finden.
Registrierungsfreie com
Registrierungsfreier Com (Regfree com) ist eine Technologie, die mit eingeführt wird Windows XP Das ermöglicht das Komponentenobjektmodell (com) Komponenten Aktivierung speichern Metadaten und Clsid (Klassenausweis
) für die Komponente ohne die Verwendung der Registrierung. Stattdessen werden die Metadaten und CLSIDs der in der Komponente implementierten Klassen in einem deklariert Versammlung manifestiert (beschrieben mit Xml), entweder als Ressource in der ausführbaren Datei oder als separate Datei gespeichert, die mit der Komponente installiert ist.[15] Dies ermöglicht es, mehrere Versionen derselben Komponente in verschiedenen Verzeichnissen zu installieren, die sowohl von ihren eigenen Manifesten als auch von ihren eigenen Manifikern beschrieben werden XCOPY -Bereitstellung.[16] Diese Technik unterstützt nur die Exe -Com -Server nur begrenzt[17] und kann nicht für systemweite Komponenten wie z. MDAC, MSXML, DirectX oder Internet Explorer.
Während des Ladens der Anwendung sucht der Windows Loader nach dem Manifest.[18] Wenn es vorhanden ist, fügt der Loader Informationen zum Aktivierungskontext hinzu.[16] Wenn die COM -Klassenfabrik versucht, eine Klasse zu instanziieren, wird der Aktivierungskontext zunächst überprüft, ob eine Implementierung für das CLSID gefunden werden kann. Nur wenn die Suche fehlschlägt, ist die Registrierung ist gescannt.[16]
Manuell instanziieren COM -Objekte
COM -Objekte können auch manuell erstellt werden, angesichts des Weges der DLL Datei und Guid des Objekts. Dies erfordert nicht, dass die DLL oder die GUID in der Systemregistrierung registriert werden muss, und nutzt keine Manifestdateien. A com dll exportiert eine Funktion namens dllgetClassObject. Das Aufrufen von dllGetClassObject mit dem gewünschten GUID und iid_iclassFactory bietet eine Instanz von a Fabrikobjekt. Das Fabrikobjekt verfügt über eine CreateInstance -Methode, mit der Instanzen eines Objekts mit einem Schnittstellen -Richtlinien erstellt werden können.[19] Dies ist derselbe Prozess, der intern beim Erstellen von Instanzen registrierter COM -Komponenten verwendet wird.[20]
Wenn das erstellte COM -Objekt ein anderes COM -Objekt mit der generischen Cocrreateinstance -API instanziiert, wird dies auf die übliche generische Weise mithilfe der Registrierung oder der Manifestdateien versuchen. Es kann jedoch interne Objekte erstellen (die möglicherweise überhaupt nicht registriert werden) und verweisen auf Schnittstellen an sie unter Verwendung ihres eigenen privaten Wissens.
Prozess- und Netzwerktransparenz
COM-Objekte können transparent instanziiert und aus demselben Prozess (In-Process), über Prozessgrenzen (außerhalb des Prozesses) oder über das Netzwerk (DCOM) hinweg verweist werden. Außerprozess- und Remote-Objekte verwenden Marshalle So serialisieren Sie Methodenaufrufe und Rückgabe von Werten über Prozess- oder Netzwerkgrenzen. Dieses Marsching ist für den Client unsichtbar, der auf das Objekt zugreift, als wäre es ein lokales In-Prozess-Objekt.
Fäden
In COM wird Threading durch ein Konzept behandelt, das als bekannt ist als Wohnungen.[21] Ein individuelles COM-Objekt lebt in genau einer Wohnung, die entweder einsthread oder mehrfach betrieben werden könnte. Es gibt drei Arten von Wohnungen in COM: Single-Threaded Wohnung (Sta), Multi-Threaded Apartment (MTA), und Fadenneutrale Wohnung (N / A). Jede Wohnung repräsentiert einen Mechanismus, bei dem der interne Zustand eines Objekts über mehrere Fäden synchronisiert werden kann. Ein Prozess kann aus mehreren COM -Objekten bestehen, von denen einige STA verwenden können und andere möglicherweise MTA verwenden. Alle Themen, die auf COM -Objekte zugreifen, leben ähnlich in einer Wohnung. Die Auswahl der Wohnung für COM-Objekte und -Threads wird zur Laufzeit bestimmt und kann nicht geändert werden.
Apartmenttyp | Beschreibung |
---|---|
Einstätsel-Wohnung[22] (Sta), (ThreadingModel =Wohnung) | Ein einzelner Thread dient dazu, die Methoden des Objekts auszuführen. In einer solchen Anordnung sind Methodenaufrufe von Fäden außerhalb der Wohnung marschiert und automatisch vom System in der Warteschlange (über eine Standard -Windows -Nachrichtenwarteschlange). Daher bietet die COM-Laufzeit eine automatische Synchronisation, um sicherzustellen, dass jeder Methode-Anruf eines Objekts immer bis zur Fertigstellung ausgeführt wird, bevor ein anderes aufgerufen wird. Der Entwickler muss sich daher keine Sorgen um Fadensperrung oder Rennbedingungen machen. |
Multi-Thread-Wohnung[23] (MTA), (ThreadingModel =Frei) | Die COM-Laufzeit bietet keine Synchronisation, und mehrere Threads dürfen COM-Objekte gleichzeitig aufrufen. COM -Objekte müssen daher eine eigene Synchronisation durchführen, um zu verhindern, dass der gleichzeitige Zugriff aus mehreren Fäden eine Rassenbedingung verursacht. Aufrufe eines MTA -Objekts von einem Thread in einem STA werden ebenfalls untersagt. |
Dynamisch bestimmte Wohnung (ThreadingModel =Beide) | In dem Beide Der Apartmentmodus wählt automatisch STA oder MTA bei Objekterstellung aus, um dem Apartment-Typ des aufrufenden Threads zu entsprechen.[24] Dies kann nützlich sein, um zu vermeiden, dass das Overhead auf MTA -Server zugegriffen wird, von einem STA -Faden. |
Fadenneutrale Wohnung (N / A), (ThreadingModel =Neutral) | Eine spezielle Wohnung ohne zugewiesene Fäden. Wenn ein STA- oder MTA -Thread ein NA -Objekt im selben Vorgang aufruft, verlässt der aufrufende Thread seine Wohnung vorübergehend und führt Code direkt in der NA aus, ohne dass ein Thread -Switching ist.[25] Daher kann man sich NA als Optimierung für effiziente Interpretment -Methodenaufrufe vorstellen. |
Themen und Objekte, die zur gleichen Wohnung gehören, folgen den gleichen Regeln für Thread -Zugriffsregeln. Methodenaufrufe, die in derselben Wohnung getätigt werden, werden daher direkt ohne Unterstützung von COM durchgeführt. Methodenaufrufe, die über die Apartments getätigt werden, werden über das Marshalling erzielt. Dies erfordert die Verwendung von Proxies und Stubs.
Kritik
Da COM eine ziemlich komplexe Implementierung hat, können Programmierer von einigen der "Sanitär" -Anprobleme abgelenkt werden.
Meldung Pumpen
Wenn ein STA initialisiert wird, wird ein verstecktes Fenster erzeugt, das für das Routing zwischen den Apartment- und Interprozess-Nachrichten verwendet wird. In diesem Fenster muss seine Meldungswarteschlange regelmäßig "gepumpt" sein. Dieses Konstrukt ist als "bekannt"Meldungspumpe". In früheren Versionen von Windows kann dies nicht zu systemweiten Deadlocks führen. Dieses Problem wird durch einige Windows-APIs kompliziert, die COM im Rahmen ihrer Implementierung initialisieren, was zu einem" Leck "von Implementierungsdetails führt.
Referenzzählung
Die Referenzzählung innerhalb von COM kann Probleme verursachen, wenn zwei oder mehr Objekte sind zirkular verwiesen. Das Design einer Anwendung muss dies berücksichtigen, damit Objekte nicht verwaist sind. Objekte können auch mit aktiven Referenzzählungen zurückgelassen werden, wenn das COM -Modell "Event Sink" verwendet wird. Da das Objekt, das das Ereignis ausbreitet, einen Hinweis auf das auf das Ereignis reagierte Objekt benötigt, wird die Referenzzahl des letzteren niemals Null erreichen. Referenzzyklen werden typischerweise entweder unter Verwendung von Abschluss außerhalb des Bandes oder geteilten Identitäten gebrochen. In der außergewöhnlichen Terminierungstechnik enthält ein Objekt eine Methode, die es bei Aufruf zwingt, seine Verweise auf andere Objekte zu fallen und dadurch den Zyklus zu brechen. In der Split -Identität -Technik enthält eine einzige Implementierung zwei separate COM -Objekte (auch als Identität bezeichnet). Dies schafft a Schwache Referenz zwischen den COM -Objekten, um einen Referenzzyklus zu verhindern.
Dll Hölle
Da In-Process-COM-Komponenten in DLL-Dateien implementiert sind und die Registrierung nur eine einzelne Version pro CLSID ermöglicht, können sie in einigen Situationen dem "dem" unterliegen ".Dll Hölle"Effekt. Registrierungsfreie COM-Fähigkeit beseitigt dieses Problem für In-Process-Komponenten; Registrierfreier COM ist für Server außerhalb des Verfahrens nicht verfügbar.
Siehe auch
- Tragbares Objekt (Computing) Cross Language Cross Plattform -Objektmodelldefinition
- Verteilter Komponentenobjektmodell (DCOM), Erweiterung, die COM in Netzwerken arbeiten kann
- Gemeinsame Sprachinfrastruktur aktuelles .NET Cross Language Cross Platform -Objektmodell
- Windows -Laufzeit, ein Anwendungsmodell, entwickelte Version von COM -Targeting Windows 8
- Corba Common Object Request Broker Architektur, Open Cross Language Cross Plattform -Objektmodell
- D-Bus Open Cross Language Cross Plattform -Objektmodell
- KPARTS Kde Komponentenrahmen
- SO M IBM-Systemobjektmodell, featurereiche Alternative zu COM
- XPCOM Mozilla -Anwendungen überqueren Plattformkomponenten -Objektmodell
- Enterprise Javabeans
- Aufruf von Java Remote -Methode
- Internetkommunikation Engine
- Sprachbindung
- Fremdenfunktionsschnittstelle
- Konvention anrufen
- Nennen Sie Mangling
- Programmierschnittstelle - API
- Anwendung Binärschnittstelle - Abi
- SCHLUCK OpenSource Automatic Interfaces Bindings Generator von vielen Sprachen zu anderen Sprachen
Anmerkungen
- ^ "Dokumentationsarchiv". Entwickler.apple.com.
- ^ "Plug-Ins und Microsofts Com". Apple Inc. Abgerufen 5. Oktober, 2010.
- ^ Microsoft Forum: Binäre Kompatibilität über visuelle C ++ - Versionen über visuelle C ++ - Versionen
- ^ "Über Network DDE - Windows -Anwendungen". Microsoft.com. 30. Mai 2018.
- ^ "Code -Ausführungstechnik nutzt den dynamischen Datenaustausch". McAfee.com. 27. Oktober 2017.
- ^ Brown, Nina; Kindel, Charlie (11. März 1998). "Draft-Brown-Dcom-V1-Spec-03-Distributed Component-Objektmodellprotokoll-DCOM/1.0". DataTracker.ietf.org. Abgerufen 29. August, 2019.
- ^ rpstrusha. "Laufzeit Callable Wrapper". msdn.microsoft.com.
- ^ rpstrusha. "Com Callable Wrapper". msdn.microsoft.com.
- ^ Steinberg, Jill (1. März 1997). "Konkurrierende Komponenten sorgen für stachelige Diskussionsteilnehmer". JavaRld. Abgerufen 2020-07-16.
- ^ "Win32com -Dokumentationsindex". docs.activestate.com.
- ^ "Python und com". www.boddie.org.uk.
- ^ "Compiler Com Support". Msdn. Microsoft.
- ^ Microsoft MSDN: C ++ - Attribute Referenz
- ^ MSDN Magazine: C ++ - Attribute: Machen Sie COM -Programmierung mit neuer Funktion in Visual Studio .NET zu einem Kinderspiel
- ^ "Versammlung manifestiert". Msdn. Abgerufen 5. November, 2009.
- ^ a b c Dave Templin. "Vereinfachen Sie die App-Bereitstellung mit ClickOnce und Registration-Free COM". Msdn Zeitschrift. Abgerufen 22. April, 2008.
- ^ "So verwenden Sie einen COM-Server außerhalb des Prozesses ohne TLB-Datei". Abgerufen 16. April, 2011.
- ^ "Konzepte isolierter Anwendungen und nebeneinandersergebnissberechtigter Versammlungen". Msdn. Abgerufen 5. Februar, 2016.
- ^ Arkhipov, Mikhail (1. April 2005). "Registrierungsfreier Com". MSDN Blogs. Abgerufen 29. April, 2016.
- ^ "DllGetClassObject Einstiegspunkt (com)". Msdn.
Wenn ein Aufruf der CogetClassObject -Funktion das Klassenobjekt findet, das in einer DLL geladen werden soll, verwendet CogetClassObject die exportierte DLLGetClassObject -Funktion der DLL.
- ^ Microsoft MSDN: Prozesse, Fäden und Wohnungen
- ^ Microsoft MSDN: Einstättelwohnungen
- ^ Microsoft MSDN: Multithread -Apartments
- ^ Microsoft MSDN: COM -Threading -Modelle verstehen und verwenden
- ^ Codeguru: COM Apartments verstehen
Verweise
- "Com: Eine kurze Einführung (PowerPoint)". Abgerufen 7. März, 2006.
- Box, Don (1998). Essential com. Addison-Wesley. ISBN 978-0-201-63446-4.
- Chappell, David (1996). ActiveX und Ole verstehen. Microsoft Press. ISBN 978-1-57231-216-6.
- "Integration und Migration von COM+ -Diensten in WCF". Abgerufen 15. April, 2010.
Externe Links
- Komponentenobjektmodell auf MSDN
- Interview mit Tony Williams, Co-Erfinder von Com (Video Webcast, August 2006)
- Info: Unterschied zwischen OLE -Kontrollen und ActiveX -Steuerelementen Von Microsoft
- Typelib -Datenformatspezifikation (inoffiziell) mit Open Source Dumper -Dienstprogramm.
- Das COM / DCOM Glossary