COM ist ein Mechanismus, der die Wiederverwendung von Objekten (oder vielmehr Komponenten) ermöglicht, unabhängig von den Sprachen, die von dem Programmierer, der die Komponente implementiert hat, und dem Programmierer, der sie verwendet, verwendet werden, und unabhängig davon, ob die Komponente im Programm des Clients implementiert wurde oder an anderer Stelle auf dem Computer (oder im Netzwerk).
Grundsätzlich bietet jede COM-Komponente eine Implementierung einer oder mehrerer Schnittstellen. Diese Schnittstellen werden sprachneutral mit der Interface Definition Language (IDL) definiert . Als Beispiel ist eine der grundlegenden Schnittstellen in COM, IUnknown , wie folgt definiert:
interface IUnknown
{
virtual HRESULT QueryInterface(REFIID riid, void **ppvObject) = 0;
virtual ULONG AddRef(void) = 0;
virtual ULONG Release(void) = 0;
};
Diese kleine Schnittstelle ist von grundlegender Bedeutung in COM, weil jede COM - Komponente muss es umsetzen. Es definiert zwei wichtige Aspekte der COM-Maschinerie:
QueryInterface
Ermöglicht das Aufrufen von Code, um eine Implementierung für eine bekannte Schnittstelle zu erhalten. In COM werden Schnittstellen durch GUIDs (auch als Interface Identifiers, IID bezeichnet) referenziert. Wenn ein Objekt mehrere Schnittstellen implementiert, erhält der Clientcode auf diese Weise einen Verweis auf jede dieser Schnittstellen. Es fungiert als eine Art Casting-Operator, wenn Sie so wollen.
AddRef()
und Release()
Implementieren des Speicherverwaltungsmechanismus für COM-Objekte. Wie der Name schon sagt, ist das häufigste Modell der Referenzzählmechanismus, bei dem eine Instanz zerstört wird, nachdem der letzte Client seine Referenz darauf freigegeben hat.
Alle COM-Komponenten werden bei der Installation beim System registriert. Wenn ein Programmierer eine bestimmte Komponente verwenden möchte, muss er:
- Stellen Sie sicher, dass die Komponente an einem erreichbaren Ort installiert ist. Meistens befindet es sich auf dem System der laufenden Anwendung, aber COM + ermöglicht auch das Vorhandensein von Komponenten auf Remotecomputern.
- Kennen Sie die GUID der angegebenen Komponente. Mit dieser GUID kann der Client das System dann auffordern, die Komponente zu instanziieren (in C wird die entsprechende Funktion aufgerufen
CoCreateInstance()
). Sie können in der Registrierung nachsehen HKEY_CLASSES_ROOT\CLSID
: Jede GUID dort enthält (höchstwahrscheinlich) eine Kennung für eine COM-Komponente oder -Schnittstelle, und die Einträge unter diesem Schlüssel geben dem System an, wie sie instanziiert werden sollen.
Die COM-Maschinerie ist äußerst komplex. Das Implementieren oder Verwenden von COM-Komponenten in C erfordert beispielsweise einen enormen Arbeitsaufwand, aber übergeordnete Sprachen wie Visual Basic haben viel dazu beigetragen, die Implementierung und Verwendung von COM-Komponenten zu vereinfachen. Die Vorteile sind jedoch sehr real. Es ist möglich, eine Anwendung beispielsweise in Visual Basic zu schreiben, die leistungskritischen Algorithmen in C oder C ++ jedoch weiterhin als COM-Objekte zu implementieren, die direkt aus dem VB-Code verwendet werden können. Das System kümmert sich um das Marshalling von Argumenten für Methodenaufrufe und leitet diese nach Bedarf durch Threads, Prozesse und Netzwerkverbindungen, damit der Clientcode den Eindruck hat, ein normales Objekt zu verwenden.
Viele grundlegende Teile von Windows basieren auf COM. Der Windows Explorer (der Dateimanager) ist beispielsweise im Grunde eine leere Shell. Es definiert eine Reihe von COM-Schnittstellen zum Navigieren und Anzeigen von Baumhierarchien. Der gesamte Code, der tatsächlich "Arbeitsplatz", die Laufwerke, die Ordner und die Dateien anzeigt, besteht aus einer Reihe von COM-Komponenten, die diese Schnittstellen implementieren.
Mit dem Aufkommen von .NET wird COM langsam veraltet.