Programmiertools richtig nutzen

DLLs programmieren, Klassen wiederverwenden

Es gibt eine ganze Menge an Möglichkeiten um Code wieder zu verwenden, und die effektivste ist dabei einen DLL. DLLs enthalten kompilierten Code, der dann von anderen Anwendungen benutzt werden kann. Der Quellcode für eine DLL kann dabei auch Klassen enthalten, und auch diese Klassen können in anderen Programmen benutzt werden: Dazu müssen im Prinzip nur die zugehörigen Header-Dateien verfügbar sein. Wie Sie eine wieder verwendbare DLL programmieren, die die MFC verwendet und eine Klasse exportiert erfahren Sie in diesem Beitrag. Von Thomas Wölfer

Die Wiederverwendung von Code ist eine wichtige Sache - es macht nicht nur keinen Sinn Quellcode in verschiedenen Projekten mehrfach vorliegen zu haben, das ist auch gefährlich und arbeitsintensiv. Der Grund dafür ist dabei einfach der, dass redundanter Code nun mal dazu führt, dass mehrere eigentlich identische Quellcode-Dateien parallel gepflegt werden müssen. Vergisst man einmal ein Update in einer der Dateien, dann liegen plötzlich unterschiedliche Versionen des eigentlich gleichen Codes vor.

Das kann man mit statischen Libraries umgehen. In diesem Fall ist der Quellcode zwar nicht mehr doppelt vorhanden - dafür aber der ausführbare Code, denn die Libraries werden dann ja in alle ausführbaren Dateien mit eingebunden. Besser sind DLLs, denn hier ist weder der Quellcode, noch der ausführbare Code doppelt vorhanden: Mehrere Programme können die gleiche DLL parallel benutzen.

Prinzipiell sind DLLs einfach zu haben, allerdings wird die Sache etwas schwierig, wenn die DLL auch Klassen exportieren soll - oder Klassen aus anderen DLLs verwenden oder erweitern soll. Ein solcher Fall ist bei Windows Programmen aber an der Tagesordnung, denn Klassen will man bei einem C++ Programm ganz sicher exportieren, und die Omnipräsenz der MFC legt natürlich nahe, das diese Klassenbibliothek auch in einer DLL benutzt werden können muss.

Darum gibt es für diesen Fall einen eigenen Anwendungs-Assistenten. Trotz seines Namens erzeugt dieser allerdings keine Anwendungen, sondern den benötigten Quellcode für eine DLL.

Dabei bietet der Assistent drei Spielarten an. Diese unterscheiden sich durch mehrere Aspekte. Der eine Unterschied liegt im Maße der Wiederverwendbarkeit der DLL: Entweder die DLL kann von allen Win32 Programmen verwendet werden, oder Sie kann nur von solchen Programmen verwendet werden die MFC verwenden. Ein weiterer Unterschied liegt darin, ob die DLL die MFC Bibliothek verwenden will oder nicht und schließlich ist es auch noch wichtig ob in der DLL Klassen definiert werden sollen, die von MFC abgleitet sind oder nicht.

Im restlichen Verlauf dieses Beitrages werden Sie erfahren, wie Sie eine DLL anlegen die Sie wieder verwenden können, die die MFC verwendet und die eine eigene Klasse exportiert. Außerdem schreiben Sie dann noch ein Programm das die DLL verwendet - und erfahren auch, welche Compiler und Linker-Optionen für einen solchen Vorgang wichtig sind.

Fürs Beispiel-Programm wählen Sie die zweite Option des Assistenten aus: Es soll eine MFC Extension DLL angelegt werden.

Der Assistent tut dann seine Arbeit und erzeugt Ihnen den minimal benötigten Quellcode, einschließlich aller Einstellungen für Compiler und Linker.

Bevor Sie diese DLL nun mit eigenem Quellcode erweitern ist es natürlich von Interesse zu erfahren, was die DLL eigentlich tun soll.

An einer anderen Stelle in diesem Sonderheft haben Sie ein Windows Programm entwickelt, das verschiedene Geometrische Objekte erzeugen und anzeigen konnte. Dabei ging es aber im Wesentlichen nur um Linien und Kreise: Man kann sich nun leicht vorstellen, das ein 'echtes' Malprogramm deutlich mehr geometrische Formen unterstützten muss, es sind also weitere Klassen notwendig.

Um nun in einem solchen Programm die Arbeit in mehrere Blöcke aufzuteilen liegt es nahe, alle geometrische Objekte in einer DLL zu implementieren: Zum einen löst das die Implementierung aus dem Hauptprojekt aus - auf diese Weise kann man diese zum Beispiel auch an eine andere Person übertragen - und zum anderen ist es auch diese Weise möglich die einmal implementierten Objekte in beliebigen zukünftigen Programmen leicht wieder zu verwenden. Das macht die Sache effektiv.

Genau dies soll die DLL aus diesem Beispiel tun: Sie wird dafür zuständig, das andere Programme die einmal definierten Geometrischen Formen wieder verwenden können.

Artikel kommentieren