www.wikidata.de-de.nina.az
Dynamic Link Library aus dem Englischen entlehnt kurz DLL bezeichnet allgemein eine dynamische Programmbibliothek meist bezieht sich der Begriff jedoch auf die fur die Betriebssysteme Windows und OS 2 verwendete Variante 1 2 Dynamic Link LibraryDateiendung dll DLLMIME Type application vnd microsoft portable executable br application x msdownload br application octet streamEntwickelt von MicrosoftArt dynamische BibliothekDLL Dateien verwenden das auch fur ausfuhrbare EXE Dateien gebrauchliche Dateiformat das in 16 Bit Programmen das New Executable Format NE 3 in 16 und 32 Bit Programmen das Linear Executable Format LE bzw LX OS 2 sowie in 32 und 64 Bit Programmen das Portable Executable Format PE Windows ist Diese Dateien konnen Programmcode Maschinencode Daten und Ressourcen in beliebiger Kombination enthalten Die Windows Dateinamenserweiterung fur solche Bibliotheken ist gewohnlich DLL Zudem konnen es jedoch auch andere Dateiendungen wie CPL fur die Systemsteuerung OCX fur Bibliotheken mit ActiveX Steuerelementen oder auch DRV fur Treiber sein Inhaltsverzeichnis 1 Hintergrund 1 1 Weitere Vorteile 1 2 Schwachen 2 Betriebssysteminterne Behandlung 2 1 Laden von DLLs bei einem Programmstart 2 2 DLL Datei Aufbau 2 3 Aufruf eines DLL Befehles durch ein Programm 2 4 DLLs im Speicher 2 5 DLL Instanzenzahler 3 Programmierbeispiele fur 32 Bit Windows 3 1 Arbeiten mit DLLs in Visual C 3 1 1 Erstellen einer DLL mit einer Funktion 3 1 2 Einbinden einer DLL und Aufrufen dieser Funktion 3 1 3 Einbinden einer DLL zur Laufzeit und Aufrufen dieser Funktion 3 2 Verwenden von DLLs in Object Pascal 3 2 1 Erstellen einer DLL 3 2 2 Eine DLL einbinden aufrufen 3 3 DLLs in Visual Basic Classic verwenden 3 4 Win32 DLLs im Net Framework verwenden 3 4 1 C 3 4 2 VB NET 3 4 3 Direkte Einbindung von DLLs in Visual Studio 3 4 3 1 C 3 4 3 2 VB Net 4 Siehe auch 5 Weblinks 6 EinzelnachweiseHintergrund Bearbeiten Hauptartikel Programmbibliothek Der Hauptzweck von DLL Dateien ist den von Anwendungen auf der Festplatte und im Hauptspeicher benotigten Speicherplatz zu reduzieren Code und Daten die von mehr als einer Anwendung benotigt werden konnten werden deshalb in einer einzelnen Datei auf der Festplatte gespeichert und nur einmal in den Hauptspeicher geladen wenn mehrere Programme dieselbe Programmbibliothek benotigen 4 Weitere Vorteile Bearbeiten Wird ein Stuck Programmcode verbessert mussen nicht alle Programme geandert werden die diesen Code nutzen sondern es genugt ihn in der DLL zu aktualisieren Alle Programme konnen in diesem Fall auf die aktualisierte Fassung zugreifen Dadurch ist es Softwareentwicklern moglich relativ kleine Patches fur grossere Softwarepakete herauszugeben beispielsweise auch fur ganze Betriebssysteme Ein ganzes Paket kann so durch die Aktualisierung einzelner DLLs auf den neuesten Stand gebracht werden In Form von Plug ins konnen mit DLLs neue Programmteile fur ein bereits bestehendes Programm erstellt und darin nahtlos integriert werden ohne dass am schon existierenden Programm Veranderungen vorgenommen werden mussten Diese Idee der dynamischen Einbindbarkeit wird zum Beispiel unter Windows durch ActiveX realisiert Auch konnen durch solch einen modularen Aufbau nicht benotigte Funktionen einfach deaktiviert werden Schwachen Bearbeiten Ein bei Windows auch DLL Konflikt genanntes Problem tritt auf wenn mehrere Anwendungen verschiedene Versionen der gleichen DLL benotigen Falls einem Programm die erforderliche Version fehlt kann das zu Problemen wie fehlerhaften Installationen fuhren Dieser Konflikt kann oft behoben werden indem die jeweils richtige Version der Programmbibliothek in den Programmordner des jeweiligen Programms kopiert wird Der Effekt der Speicherersparnis wird dadurch allerdings wieder zunichtegemacht Mit Microsoft NET ist es moglich Versionskonflikte bei DLL Dateien zu umgehen indem sie die gleichzeitige Existenz von mehreren Versionen einer Programmbibliothek ermoglichen Dies ist aber nur fur mit NET entwickelte DLL Dateien moglich In bestimmten Fallen ist DLL Hijacking oder die bosartige Nutzung von DLL Injection moglich Betriebssysteminterne Behandlung BearbeitenLaden von DLLs bei einem Programmstart Bearbeiten Wenn ein Programm ausgefuhrt werden soll dann wird es vom Loader des Betriebssystems in den Speicher geladen und die Import Table des Programms ausgelesen In dieser Tabelle befinden sich alle DLL Befehls Namen oder die Ordnungszahlen der DLL Befehle die von diesem Programm benotigt werden Der Loader ladt nun die fehlenden DLLs in den Speicher und fugt in der Import Table des Programms die Einsprungadressen der einzelnen Befehle ein DLL Datei Aufbau Bearbeiten Eine DLL hat nach dem MZ Header denselben NE LE oder PE Header wie eine normale ausfuhrbare Datei nur ist im Falle einer NE der DWORD Flag an der Adresse 0Chex im NE Header auf 8000hex gesetzt Library Module flag 3 beziehungsweise im PE Header im Characteristics Wert das IMAGE FILE DLL Bit gesetzt Wahrend sowohl DLLs als auch ausfuhrbare Dateien eine Export Table besitzen konnen wird dies bei letzteren selten benutzt In dieser Export Table sind alle Namen der Funktionen und Variablen aufgelistet die die DLL an externe Software zur Verfugung stellt Diese Namen mussen alphabetisch sortiert sein damit der Loader sie finden kann Aufruf eines DLL Befehles durch ein Programm Bearbeiten Zuerst werden die zu ubergebenden Werte sinngemass wie bei anderen Unterprogrammen auf dem Stack abgelegt dann wird ein indirekter Sprung auf den Wert der vom Loader in der Import Tabelle hinterlegten DLL Adresse durchgefuhrt DLLs im Speicher Bearbeiten Es gibt zwei verschiedene Varianten wie DLLs vom Betriebssystem in den Speicher geladen werden konnen Es gibt statische DLLs die nur einmal geladen werden Alle Programme greifen dann auf diese eine Instanz der DLL zu Diese DLL besitzt dann nur einen einzigen globalen Speicherbereich Die Windows Kernel DLLs sind solche statischen DLLs was ihnen erlaubt das gesamte System zu verwalten z B alle offenen Dateien zu uberwachen Eine andere Variante DLLs im Speicher zu verwalten ist die dass jedes Mal wenn ein neues Programm eine DLL benotigt eine neue Instanz von dieser in den Speicher geladen wird Ob eine DLL statisch ist oder nicht legt ein weiteres Flag im Header der DLL fest DLL Instanzenzahler Bearbeiten Jedes Mal wenn eine DLL von einem Programm geladen wird wird ein interner Instanzenzahler fur diese DLL erhoht Uber diesen Zahler kann das System erkennen ob eine DLL noch in Verwendung ist oder entladen werden kann Letzteres geschieht wenn der Instanzenzahler null erreicht da das letzte laufende Programm welches die DLL benutzt hat die DLL entladen hat und diese nicht weiter im Speicher vorgehalten werden muss Programmierbeispiele fur 32 Bit Windows BearbeitenArbeiten mit DLLs in Visual C Bearbeiten Erstellen einer DLL mit einer Funktion Bearbeiten Die DLL Schnittstelle wird mit Hilfe der Export Funktion declspec dllexport definiert Dies wird im folgenden Beispiel demonstriert Nur unter Microsoft Visual C hat das Makro DLL eine Funktion Unter zum Beispiel Linux ist das Makro DLL leer if defined MSC VER include lt windows h gt define DLL extern C declspec dllexport else define DLL endif Die Funktion die anderen Programmen zur Verfugung gestellt werden soll in diesem Beispiel Addieren zweier Zahlen DLL double AddNumbers double a double b return a b Dieses Beispiel erzeugt beim Kompilieren sowohl eine DLL als auch eine LIB Datei Einbinden einer DLL und Aufrufen dieser Funktion Bearbeiten DLL Funktionen konnen einfach aufgerufen werden nachdem man sie mit der Funktion declspec dllimport importiert hat include lt windows h gt include lt stdio h gt Importieren der Funktion aus der oben erstellten DLL extern C declspec dllimport double AddNumbers double a double b int main void Aufrufen der externen Funktion double result AddNumbers 1 2 printf Das Ergebnis ist f n result return 0 Zu beachten ist dass der Linker die LIB Datei benotigt und dass sich die DLL Datei im selben Ordner wie das Programm das sie aufrufen soll befinden sollte Die LIB Datei wird vom Linker benotigt damit er Platzhalter fur die spater aus der DLL aufgerufenen Funktionen einbauen kann Einbinden einer DLL zur Laufzeit und Aufrufen dieser Funktion Bearbeiten DLL Bibliotheken konnen auf zwei verschiedene Weisen in eine Anwendung geladen werden entweder gleich beim Starten des Programms so wie in den obigen Beispielen beschrieben oder erst spater wahrend der Laufzeit indem man die API Funktionen LoadLibrary GetProcAddress und FreeLibrary verwendet Die Art und Weise wie DLLs wahrend der Laufzeit einzubinden sind ist in jeder Programmiersprache gleich solange man eine Windows API Funktion importieren mochte Der folgende Code demonstriert das anhand eines VC Beispieles include lt windows h gt include lt stdio h gt Definition des Types der DLL Funktion die verwendet werden soll typedef double BinaryFunction t double double int main void BinaryFunction t AddNumbers double result BOOL fFreeResult DLL Datei laden HINSTANCE hinstLib LoadLibrary MyDll dll if hinstLib NULL Die Einsprungadresse abfragen AddNumbers BinaryFunction t GetProcAddress hinstLib AddNumbers Die Funktion aufrufen if AddNumbers NULL result AddNumbers 1 2 Die DLL Datei wieder entladen fFreeResult FreeLibrary hinstLib Das Ergebnis anzeigen if hinstLib NULL AddNumbers NULL printf Fehler Konnte die Funktion nicht aufrufen n else printf Das Ergebnis ist f n result return 0 Die LIB Datei wird in diesem Fall nicht benotigt Die DLL Datei muss aber immer noch in einem Ordner liegen der dem Programm zuganglich ist Zu beachten ist ausserdem dass beim Versuch eine nicht vorhandene DLL direkt beim Programmstart automatisch mitladen zu lassen vom Betriebssystem eine Fehlermeldung angezeigt und das Programm beendet wird ohne dass der Programmierer eine Moglichkeit hat diesen Fehler abzufangen Beim Einbinden von DLLs wahrend der Laufzeit konnen Fehler beim Laden hingegen abgefangen werden Verwenden von DLLs in Object Pascal Bearbeiten Erstellen einer DLL Bearbeiten Im Kopf des Quellcodes muss das Schlusselwort library an Stelle von program verwendet werden Am Ende der Datei werden dann die zu exportierenden Funktionen im exports Bereich aufgelistet library Beispiel Die Funktion die anderen Programmen zur Verfugung gestellt werden soll in diesem Beispiel Addieren zweier Zahlen function AddNumbers a b Double Double cdecl begin Result a b end Exportieren der Funktion exports AddNumbers In diesem Fall muss kein spezieller Initialisierungs Quellcode angegeben werden begin end Eine DLL einbinden aufrufen Bearbeiten Delphi benotigt keine LIB Dateien um eine Funktion korrekt importieren zu konnen Zum Einbinden einer DLL muss lediglich das Schlusselwort external verwendet werden program Beispiel APPTYPE CONSOLE Importieren der Funktion aus einer externen DLL function AddNumbers a b Double Double cdecl external Beispiel dll var result Double begin result AddNumbers 1 2 Writeln Das Ergebnis ist result end DLLs in Visual Basic Classic verwenden Bearbeiten Von VB bis zur Version 6 wird nur das Laden von DLLs wahrend der Laufzeit unterstutzt Zusatzlich zur Verwendung der API Funktionen LoadLibrary und GetProcAddress ist es in Visual Basic aber moglich externe DLL Funktionen zu deklarieren was fur den Entwickler diese Arbeit um einiges einfacher macht Option Explicit On Declare Function AddNumbers Lib Example dll ByVal a As Double ByVal b As Double As Double Sub Main Dim Result As Double Result AddNumbers 1 2 Debug Print Das Ergebnis ist amp Result End Sub Wenn beim Laden der DLL Funktion ein Fehler auftritt lost VB einen Laufzeitfehler aus Dieser kann aber abgefangen und behandelt werden Weiterhin muss man die Aufrufkonvention der exportierten Funktion beachten Visual Basic nimmt an dass die Funktion stdcall ist Deshalb war bis VB7 der Import von cdecl Funktionen nur uber eine zwischengeschaltete Wrapper DLL moglich Win32 DLLs im Net Framework verwenden Bearbeiten In NET werden DLLs mithilfe des DllImport Attributs eingebunden Dazu ist der Namespace System Runtime InteropServices notig Der Funktionsprototyp wird in C als extern angegeben was in VB NET nicht notig ist anschliessend kann die Funktion wie jede andere angesprochen werden C Bearbeiten using System using System Runtime InteropServices namespace DllImportBeispiel class Program DllImport Example dll static extern double AddNumbers double a double b static void Main Console WriteLine AddNumbers 1 2 VB NET Bearbeiten Imports System Runtime InteropServices Class Program lt DllImport Example dll gt Private Shared Function AddNumbers a As Double b As Double As Double End Function Private Shared Sub Main Console WriteLine AddNumbers 1 2 End Sub End Class Direkte Einbindung von DLLs in Visual Studio Bearbeiten Wenn jedoch auf mehrere Methoden oder Funktionen einer DLL zugegriffen werden soll kann diese auch uber den Projekt Explorer von Visual Studio direkt eingebunden werden 5 Anschliessend konnen die Funktionen der DLL verwendet werden indem man entweder im Code den vollstandigen Namespace vor der Klasse der Methode angibt oder indem man mit using C beziehungsweise Imports VB Net den Namespace direkt einbindet Bei dieser Vorgehensweise wird der System Runtime InteropServices Namespace nicht benotigt Im Folgenden ist obiges Beispiel mit direkt eingebundener DLL veranschaulicht der Namespace entspricht hier dem Namen der DLL C Bearbeiten using Example class Program static void Main Console WriteLine AddNumbers 1 2 VB Net Bearbeiten Imports Example Class Program Private Shared Sub Main Console WriteLine AddNumbers 1 2 End Sub End ClassSiehe auch BearbeitenDependency Walker Bestandteil des Microsoft Visual Studio bis zur Version 2005 mit dem man sich Funktionen die ein Programm ex und importiert hierarchisch anzeigen lassen kann Weblinks BearbeitenVerwenden von declspec dllimport und declspec dllexport bei MSDN Library Win32 DLL Anleitung wie man in C mit Visual Studio DLLs erstellen und aufrufen kann englisch Durch Grafiken und Videos unterstutzte Beschreibung der Windows Bibliotheken Statische Libs und DLLs Einzelnachweise Bearbeiten Was ist Dynamic Link Library DLL Definition von WhatIs com Abgerufen am 24 Mai 2022 DLL Datei was ist das Abgerufen am 24 Mai 2022 a b K B Microsoft Executable File Header Format Deland Han Dynamic Link Library DLL Windows Client Abgerufen am 24 Mai 2022 deutsch corob msft Walkthrough Create and use your own Dynamic Link Library C Abgerufen am 24 Mai 2022 amerikanisches Englisch Abgerufen von https de wikipedia org w index php title Dynamic Link Library amp oldid 234780625