Erstellen von C/C++-DLLs in Visual Studio

Unter Windows bezeichnet eine Dynamic-Link Library (DLL) einen Dateityp, der ausführbare Routinen enthält und als eine gemeinsam genutzte Bibliothek von Funktionen und Ressourcen dient. Die dynamische Verknüpfung ist eine Betriebssystemfunktion. Über diese Funktion können ausführbare Dateien Funktionen aufrufen oder Ressourcen verwenden, die in einer separaten Datei gespeichert sind. Diese Funktionen und Ressourcen können getrennt von den ausführbaren Dateien, von denen sie verwendet werden, kompiliert und bereitgestellt werden.

Eine DLL ist keine eigenständige ausführbare Datei. DLLs werden im Kontext der Anwendungen ausgeführt, von denen sie aufgerufen werden. Das Betriebssystem lädt die DLL in den Speicherbereich einer Anwendung. Dies erfolgt entweder beim Laden der Anwendung (implizites Verknüpfen) oder bei Bedarf zur Laufzeit (explizites Verknüpfen). DLLs machen es außerdem einfach, Funktionen und Ressourcen in ausführbaren Dateien gemeinsam zu nutzen. Mehrere Anwendungen können gleichzeitig auf den Inhalt einer einzigen Kopie einer im Arbeitsspeicher enthaltenen DLL zugreifen.

Unterschiede zwischen dynamischer und statischer Verknüpfung

Bei der statischen Verknüpfung wird der gesamte Objektcode einer statischen Bibliothek in die ausführbaren Dateien kopiert. Der Code wird bei der Erstellung dieser Dateien verwendet. Bei der dynamischen Verknüpfung werden nur bestimmte Informationen eingebunden. Diese werden von Windows zur Laufzeit benötigt, um die DLL, die ein Datenelement oder eine Funktion enthält, zu finden und zu laden. Wenn Sie eine DLL erstellen, erstellen Sie auch eine Importbibliothek, die diese Informationen enthält. Wenn Sie eine ausführbare Datei erstellen, die die DLL aufruft, werden diese Informationen vom Linker für das Windows-Ladeprogramm gespeichert. Dies geschieht unter Verwendung der exportierten Symbole in der Importbibliothek. Wenn das Ladeprogramm eine DLL lädt, wird die DLL in den Speicherbereich Ihrer Anwendung eingebunden. Falls vorhanden, wird eine spezielle Funktion in der DLL, DllMain, aufgerufen, um die von der DLL benötigte Initialisierung durchzuführen.

Unterschiede zwischen Anwendungen und DLLs

Obwohl sowohl DLLs als auch Anwendungen ausführbare Module sind, unterscheiden sie sich in verschiedener Hinsicht. Der offensichtlichste Unterschied besteht darin, dass Sie eine DLL nicht ausführen können. Im Hinblick auf das System gibt es zwei grundsätzliche Unterschiede zwischen Anwendungen und DLLs:

  • Es können mehrere Anwendungsinstanzen gleichzeitig im System ausgeführt werden. Bei einer DLL ist nur eine Instanz möglich.

  • Eine Anwendung kann als Prozess geladen werden. Sie kann über einen Stapel, Ausführungsthreads, globalen Arbeitsspeicher, Dateihandles und eine Nachrichtenwarteschlange verfügen. Eine DLL kann diese Dinge nicht besitzen.

Vorteile der Verwendung von DLLs

Dynamisches Verknüpfen mit Code und Ressourcen bietet im Vergleich zum statischen Verknüpfen mehrere Vorteile:

  • Beim dynamischen Verknüpfen wird Arbeitsspeicher gespart und der Austausch reduziert. Eine DLL kann von vielen Prozessen gleichzeitig verwendet werden. Dabei wird eine einzelne, in den Arbeitsspeicher geladene Kopie der schreibgeschützten Teile einer DLL gemeinsam genutzt. Im Gegensatz dazu verfügt jede Anwendung, die mithilfe einer statisch verknüpften Bibliothek erstellt wird, über eine vollständige Kopie des Bibliothekscodes, den Windows in den Arbeitsspeicher laden muss.

  • Beim dynamischen Verknüpfen werden Speicherplatz und Bandbreite eingespart. Viele Anwendungen können eine einzelne, auf der Festplatte gespeicherte Kopie der DLL gemeinsam nutzen. Im Gegensatz dazu wird für jede Anwendung, die mit einer statischen Verknüpfungsbibliothek erstellt wurde, der Bibliothekscode in deren ausführbares Image eingebunden. Dabei werden mehr Speicherplatz und mehr Bandbreite für die Übertragung verwendet.

  • Die Verwaltung, Sicherheitskorrekturen und Upgrades können einfacher durchzuführen sein. Wenn Ihre Anwendungen allgemeine Funktionen in einer DLL verwenden, können Sie für die DLL Fehlerbehebungen durchführen und Updates bereitstellen. Bei einem DLL-Update brauchen die Anwendungen, die die betreffenden DLLs verwenden, nicht neu kompiliert oder neu gelinkt werden. Sie können die neue DLL verwenden, sobald diese bereitgestellt wurde. Wenn Sie im Gegensatz dazu Fehlerbehebungen in statisch verknüpftem Objektcode vornehmen, müssen Sie jede Anwendung, die diesen verwendet, neu verknüpfen und erneut bereitstellen.

  • Sie können DLLs zum Bereitstellen von Unterstützung nach der Vermarktung verwenden. Beispielsweise kann eine Bildschirmtreiber-DLL geändert werden, um ein Anzeigegerät zu unterstützen, das zum Auslieferungszeitpunkt der Anwendung noch nicht verfügbar war.

  • Mithilfe der expliziten Verknüpfung können Sie DLLs zur Laufzeit ermitteln und laden. Dazu gehören beispielsweise Anwendungserweiterungen, mit deren Hilfe Sie Ihrer Anwendung neue Funktionen hinzufügen können, ohne die Anwendung neu erstellen oder neu bereitstellen zu müssen.

  • Die dynamische Verknüpfung erleichtert die Unterstützung von Anwendungen, die in verschiedenen Programmiersprachen geschrieben wurden. Programme, die in verschiedenen Programmiersprachen erstellt wurden, können dieselbe DLL-Funktion aufrufen, solange sie die Aufrufkonvention der Funktion einhalten. Die Programme und die DLL-Funktion müssen auf folgende Weise kompatibel sein: Die Reihenfolge, in der die Funktion erwartet, dass ihre Argumente auf den Stapel verschoben werden. ob die Funktion oder die Anwendung für das Bereinigen des Stapels verantwortlich ist, und ob Argumente in Registern übermittelt werden.

  • Die dynamische Verknüpfung stellt einen Mechanismus zum Erweitern der MFC-Bibliotheksklassen (Microsoft Foundation Class) bereit. Sie können Klassen von bestehenden MFC-Klassen ableiten und diese in einer MFC-Erweiterungs-DLL speichern, die dann von MFC-Anwendungen genutzt werden kann.

  • Durch das dynamische Verknüpfen wird die Erstellung internationaler Versionen Ihrer Anwendung vereinfacht. DLLs sind eine praktische Methode zum Bereitstellen gebietsschemaspezifischer Ressourcen, durch die das Erstellen internationaler Versionen einer Anwendung deutlich vereinfacht wird. Anstatt viele lokalisierte Versionen Ihrer Anwendung zu versenden, können Sie die Zeichenfolgen und Images für jede Sprache in einer separaten Ressourcen-DLL ablegen. Die Anwendung kann dann die entsprechenden Ressourcen für dieses Gebietsschema zur Laufzeit laden.

Ein potenzieller Nachteil bei der Verwendung von DLLs besteht darin, dass die Anwendung nicht eigenständig ist. Dies hängt davon ab, ob ein separates DLL-Modul vorhanden ist, das Sie im Rahmen der Installation bereitstellen oder selbst überprüfen müssen.

Weitere Informationen zum Erstellen und Verwenden von DLLs

Die folgenden Artikel enthalten ausführliche Informationen zum Erstellen von C-/C++-DLLs in Visual Studio.

Exemplarische Vorgehensweise: Erstellen und Verwenden einer Dynamic Link Library (C++)
Beschreibt, wie Sie mit Visual Studio eine DLL erstellen und verwenden.

Arten von DLLs
Bietet Informationen zu den verschiedenen Arten von DLLs, die erstellt werden können.

Häufig gestellte Fragen (FAQs) zu DLLs
Bietet Antworten auf häufig gestellte Fragen zu DLLs.

Verknüpfen einer ausführbaren Datei mit einer DLL
Beschreibt das explizite und implizite Verknüpfen mit einer DLL.

Initialisieren einer DLL
In diesem Artikel wird der Initialisierungscode einer DLL beschrieben, der beim Laden der DLL ausgeführt werden muss.

Verhalten der Laufzeitbibliothek für DLLs und Visual C++
Dieser Artikel beschreibt die DLL-Startsequenz der Laufzeitbibliothek.

„LoadLibrary“ und „AfxLoadLibrary“
In diesem Artikel wird die Verwendung von LoadLibrary und AfxLoadLibrary bei der expliziten Verknüpfung einer DLL zur Laufzeit beschrieben.

GetProcAddress
In diesem Artikel wird die Verwendung von GetProcAddress zum Abrufen der Adresse einer exportierten Funktion in der DLL beschrieben.

FreeLibrary und AfxFreeLibrary
In diesem Artikel wird die Verwendung von FreeLibrary und AfxFreeLibrary in Situationen beschrieben, in denen das DLL-Modul nicht länger benötigt wird.

Dynamic Link Library-Suchreihenfolge
Beschreibt den Suchpfad, der von Windows verwendet wird, um eine DLL im System zu finden.

Modulzustände einer regulären, dynamisch mit MFC verknüpften MFC-DLL
In diesem Artikel werden die Modulzustände einer regulären, dynamisch mit MFC verknüpften MFC-DLL beschrieben.

MFC-Erweiterungs-DLLs
In diesem Artikel werden DLLs erläutert, die in der Regel wiederverwendbare Klassen implementieren, die von den bestehenden MFC-Klassen abgeleitet wurden.

Erstellen einer DLL als reine Ressource
Erörtert eine reine Ressourcen-DLL, die ausschließlich Ressourcen enthält, z. B. Symbole, Bitmaps, Zeichenfolgen und Dialogfelder.

Lokalisierte Ressourcen in MFC-Anwendungen: Satelliten-DLLs
Bietet erweiterte Unterstützung für Satelliten-DLLs, eine Funktion, die den Entwickler bei der Erstellung von Anwendungen unterstützt, die für mehrere Sprachen lokalisiert sind.

Importieren und Exportieren
Beschreibt das Importieren öffentlicher Symbole in eine Anwendung bzw. das Exportieren von Funktionen aus einer DLL.

Active Technology und DLLs
Bietet die Möglichkeit, Objektserver innerhalb einer DLL zu implementieren.

Automatisierung in einer DLL
Beschreibt, welche Features die Automatisierungsoption im MFC-DLL-Assistenten bereitstellt.

Namenskonventionen für MFC-DLLs
Erörtert, nach welcher strukturierten Namenskonvention die in MFC enthaltenen DLLs und Bibliotheken benannt sind.

Aufrufen von DLL-Funktionen in Visual Basic-Anwendungen
Beschreibt den Aufruf von DLL-Funktionen aus Visual Basic-Anwendungen.

Verwenden von MFC als Teil einer DLL
In diesem Artikel werden reguläre MFC-DLLs beschrieben, über die Sie die MFC-Bibliothek als Bestandteil einer Windows-DLL (Dynamic Link Library) verwenden können.

DLL-Version von MFC
In diesem Artikel wird beschrieben, wie die gemeinsam genutzten Dynamic Link Librarys „MFCxx.dll“ und „MFCxxD.dll“ (wobei x für die MFC-Versionsnummer steht) mit MFC-Anwendungen und MFC-Erweiterungs-DLLs verwendet werden können.