Movatterモバイル変換


[0]ホーム

URL:


Zum Inhalt springen
WikipediaDie freie Enzyklopädie
Suche

Dynamic Link Library

aus Wikipedia, der freien Enzyklopädie
Dynamic Link Library
Es zeigt zwei einfache geometrische Formen – ein großes und ein kleines Zahnrad.
Dateiendung:.dll, .DLL
MIME-Type:application/vnd.microsoft.portable-executable,
application/x-msdownload,
application/octet-stream
Entwickelt von:Microsoft
Art:dynamische Bibliothek


Dynamic Link Library (aus demEnglischen entlehnt; kurzDLL) bezeichnet allgemein einedynamische Programmbibliothek; meist bezieht sich der Begriff jedoch auf die für dieBetriebssystemeWindows undOS/2 verwendete Variante.[1][2]

DLL-Dateien verwenden das auch für ausführbareEXE-Dateien gebräuchlicheDateiformat, das in 16-Bit-Programmen dasNew-Executable-Format,[3] in 16- und 32-Bit-Programmen dasLinear-Executable-Format sowie in 32- und 64-Bit-Programmen dasPortable-Executable-Format ist. Diese Dateien können Programmcode (Maschinencode), Daten undRessourcen in beliebiger Kombination enthalten.

Die Windows-Dateinamenserweiterung für solche Bibliotheken ist gewöhnlichDLL. Zudem können es jedoch auch andere Dateiendungen, wieCPL (für dieSystemsteuerung),OCX (für Bibliotheken mitActiveX-Steuerelementen) oder auchDRV (fürTreiber), sein.

Hintergrund

[Bearbeiten |Quelltext bearbeiten]
Hauptartikel:Programmbibliothek

Der Hauptzweck von DLL-Dateien ist, den von Anwendungen auf der Festplatte und im Hauptspeicher benötigten Speicherplatz zu reduzieren. Code und Daten, die von mehr als einer Anwendung benötigt werden könnten, werden deshalb in einer einzelnen Datei auf derFestplatte gespeichert und nur einmal in den Hauptspeicher geladen, wenn mehrere Programme dieselbe Programmbibliothek benötigen.[4]

Weitere Vorteile

[Bearbeiten |Quelltext bearbeiten]

Wird ein Stück Programmcode verbessert, müssen nicht alle Programme geändert werden, die diesen Code nutzen, sondern es genügt, ihn in der DLL zu aktualisieren. Alle Programme können in diesem Fall auf die aktualisierte Fassung zugreifen. Dadurch ist es Softwareentwicklern möglich, relativ kleinePatches für größere Softwarepakete herauszugeben, beispielsweise auch für ganze Betriebssysteme. Ein ganzes Paket kann so durch die Aktualisierung einzelner DLLs auf den neuesten Stand gebracht werden.

In Form vonPlug-ins können mit DLLs neue Programmteile für ein bereits bestehendes Programm erstellt und darin nahtlos integriert werden, ohne dass am schon existierenden Programm Veränderungen vorgenommen werden müssten. Diese Idee der dynamischen „Einbindbarkeit“ wird zum Beispiel unter Windows durchActiveX realisiert.

Auch können durch solch einen modularen Aufbau nicht benötigte Funktionen einfach deaktiviert werden.

Schwächen

[Bearbeiten |Quelltext bearbeiten]

Ein bei Windows auchDLL-Konflikt genanntes Problem tritt auf, wenn mehrere Anwendungen verschiedene Versionen der gleichen DLL benötigen. Falls einem Programm die erforderliche Version fehlt, kann das zu Problemen, wie fehlerhaften Installationen, führen. 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. MitMicrosoft .NET ist es möglich, Versionskonflikte bei DLL-Dateien zu umgehen, indem sie die gleichzeitige Existenz von mehreren Versionen einer Programmbibliothek ermöglichen. Dies ist aber nur für mit .NET entwickelte DLL-Dateien möglich.

In bestimmten Fällen istDLL Hijacking oder die bösartige Nutzung vonDLL-Injection möglich.

Betriebssysteminterne Behandlung

[Bearbeiten |Quelltext bearbeiten]

Laden von DLLs bei einem Programmstart

[Bearbeiten |Quelltext bearbeiten]

Wenn ein Programm ausgeführt werden soll, dann wird es vom Loader des Betriebssystems in den Speicher geladen und die „Import-Tabelle“ des Programms ausgelesen. In dieser Tabelle befinden sich alle DLL-Befehls-Namen oder die Ordnungszahlen der DLL-Befehle, die von diesem Programm benötigt werden. Der Loader lädt nun die fehlenden DLLs in den Speicher und fügt in der Import-Tabelle des Programms die Einsprungadressen der einzelnen Befehle ein.

DLL-Datei-Aufbau

[Bearbeiten |Quelltext bearbeiten]

Eine DLL hat (nach demMZ-Header) denselbenNE-,LE/LX- oderPE-Header wie eine normaleausführbare 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 imCharacteristics-Wert dasIMAGE_FILE_DLL-Bit gesetzt. Während sowohl DLLs als auch ausführbare Dateien eine „Export-Tabelle“ besitzen können, wird dies bei letzteren selten benutzt. In dieser Export-Tabelle sind alle Namen der Funktionen und Variablen aufgelistet, die die DLL an externe Software zur Verfügung stellt. Diese Namen müssen alphabetisch sortiert sein, damit der Loader sie finden kann.

Aufruf eines DLL-Befehles durch ein Programm

[Bearbeiten |Quelltext bearbeiten]

Zuerst werden die zu übergebenden Werte – sinngemäß wie bei anderenUnterprogrammen – auf demStack abgelegt, dann wird ein indirekter Sprung auf den Wert der vom Loader in der Import-Tabelle hinterlegten DLL-Adresse durchgeführt.

DLLs im Speicher

[Bearbeiten |Quelltext bearbeiten]

Es gibt zwei verschiedene Varianten, wie DLLs vom Betriebssystem in den Speicher geladen werden können. 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 überwachen).Eine andere Variante DLLs im Speicher zu verwalten, ist die, dass jedes Mal, wenn ein neues Programm eine DLL benötigt, 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-Instanzenzähler

[Bearbeiten |Quelltext bearbeiten]

Jedes Mal, wenn eine DLL von einem Programm geladen wird, wird ein interner Instanzenzähler für diese DLL erhöht. Über diesen Zähler kann das System erkennen, ob eine DLL noch in Verwendung ist oder entladen werden kann. Letzteres geschieht, wenn der Instanzenzähler 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 für 32-Bit Windows

[Bearbeiten |Quelltext bearbeiten]

Arbeiten mit DLLs in Visual C++

[Bearbeiten |Quelltext bearbeiten]

Erstellen einer DLL mit einer Funktion

[Bearbeiten |Quelltext 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<windows.h>#define DLL   extern "C" __declspec(dllexport)#else#define DLL#endif// Die Funktion, die anderen Programmen zur Verfügung gestellt werden soll// (in diesem Beispiel: Addieren zweier Zahlen)DLLdoubleAddNumbers(doublea,doubleb){returna+b;}

Dieses Beispiel erzeugt beim Kompilieren sowohl eineDLL als auch eineLIB-Datei.

Einbinden einer DLL und Aufrufen dieser Funktion

[Bearbeiten |Quelltext bearbeiten]

DLL-Funktionen können einfach aufgerufen werden, nachdem man sie mit der Funktion__declspec(dllimport) importiert hat.

#include<windows.h>#include<stdio.h>// Importieren der Funktion aus der oben erstellten DLLextern"C"__declspec(dllimport)doubleAddNumbers(doublea,doubleb);intmain(void){// Aufrufen der externen Funktiondoubleresult=AddNumbers(1,2);printf("Das Ergebnis ist: %f\n",result);return0;}

Zu beachten ist, dass der Linker die LIB-Datei benötigt und dass sich die DLL-Datei im selben Ordner wie das Programm, das sie aufrufen soll, befinden sollte. Die LIB-Datei wird vom Linker benötigt, damit er „Platzhalter“ für die später aus der DLL aufgerufenen Funktionen einbauen kann.

Einbinden einer DLL zur Laufzeit und Aufrufen dieser Funktion

[Bearbeiten |Quelltext bearbeiten]

DLL-Bibliotheken können auf zwei verschiedene Weisen in eine Anwendung geladen werden: entweder gleich beim Starten des Programms (so wie in den obigen Beispielen beschrieben) oder erst später während der Laufzeit, indem man dieAPI-FunktionenLoadLibrary,GetProcAddress undFreeLibrary verwendet. Die Art und Weise, wie DLLs während der Laufzeit einzubinden sind, ist in jeder Programmiersprache gleich, solange man eineWindows-API-Funktion importieren möchte. Der folgende Code demonstriert das anhand eines VC++-Beispieles:

#include<windows.h>#include<stdio.h>// Definition des Types der DLL-Funktion, die verwendet werden solltypedefdouble(*BinaryFunction_t)(double,double);intmain(void){BinaryFunction_tAddNumbers;doubleresult;BOOLfFreeResult;// DLL-Datei ladenHINSTANCEhinstLib=LoadLibrary("MyDll.dll");if(hinstLib!=NULL){// Die Einsprungadresse abfragenAddNumbers=(BinaryFunction_t)GetProcAddress(hinstLib,"AddNumbers");// Die Funktion aufrufenif(AddNumbers!=NULL)result=(*AddNumbers)(1,2);// Die DLL-Datei wieder entladenfFreeResult=FreeLibrary(hinstLib);}// Das Ergebnis anzeigenif(hinstLib==NULL||AddNumbers==NULL)printf("Fehler: Konnte die Funktion nicht aufrufen\n");elseprintf("Das Ergebnis ist: %f\n",result);return0;}

DieLIB-Datei wird in diesem Fall nicht benötigt. DieDLL-Datei muss aber immer noch in einem Ordner liegen, der dem Programm zugänglich ist.

Zu beachten ist außerdem, 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 Möglichkeit hat, diesen Fehler abzufangen. Beim Einbinden von DLLs während der Laufzeit können Fehler beim Laden hingegen abgefangen werden.

Verwenden von DLLs in Object Pascal

[Bearbeiten |Quelltext bearbeiten]

Erstellen einer DLL

[Bearbeiten |Quelltext bearbeiten]

Im Kopf des Quellcodes muss das Schlüsselwortlibrary an Stelle vonprogram verwendet werden. Am Ende der Datei werden dann die zu exportierenden Funktionen imexports-Bereich aufgelistet:

libraryBeispiel;// Die Funktion, die anderen Programmen zur Verfügung gestellt werden soll// (in diesem Beispiel: Addieren zweier Zahlen)functionAddNumbers(a,b:Double):Double;cdecl;beginResult:=a+b;end;// Exportieren der FunktionexportsAddNumbers;// In diesem Fall muss kein spezieller Initialisierungs-Quellcode angegeben werdenbeginend.

Eine DLL einbinden / aufrufen

[Bearbeiten |Quelltext bearbeiten]

Delphi benötigt keineLIB-Dateien, um eine Funktion korrekt importieren zu können. Zum Einbinden einer DLL muss lediglich das Schlüsselwortexternal verwendet werden:

programBeispiel;{$APPTYPE CONSOLE}// Importieren der Funktion aus einer externen DLLfunctionAddNumbers(a,b:Double):Double;cdecl;external'Beispiel.dll';varresult:Double;beginresult:=AddNumbers(1,2);Writeln('Das Ergebnis ist: ',result)end.

DLLs in Visual Basic Classic verwenden

[Bearbeiten |Quelltext bearbeiten]

Von VB bis zur Version 6 wird nur das Laden von DLLs während der Laufzeit unterstützt. Zusätzlich zur Verwendung der API-FunktionenLoadLibrary undGetProcAddress ist es in Visual Basic aber möglich, externe DLL-Funktionen zudeklarieren, was für den Entwickler diese Arbeit um einiges einfacher macht:

OptionExplicitOnDeclareFunctionAddNumbersLib"Example.dll"(ByValaAsDouble,ByValbAsDouble)AsDoubleSubMain()DimResultAsDoubleResult=AddNumbers(1,2)Debug.Print"Das Ergebnis ist: "&ResultEndSub

Wenn beim Laden der DLL-Funktion ein Fehler auftritt, löst VB einen Laufzeitfehler aus. Dieser kann aber abgefangen und behandelt werden. Weiterhin muss man dieAufrufkonvention der exportierten Funktion beachten: Visual Basic nimmt an, dass die Funktion_stdcall ist. Deshalb war bis VB7 der Import von_cdecl-Funktionen nur über eine zwischengeschalteteWrapper-DLL möglich.

Win32-DLLs im .Net-Framework verwenden

[Bearbeiten |Quelltext bearbeiten]

In .NET werden DLLs mithilfe des DllImport-Attributs eingebunden. Dazu ist der Namespace „System.Runtime.InteropServices“ nötig. DerFunktionsprototyp wird inC# als „extern“ angegeben, was inVB.NET nicht nötig ist, anschließend kann die Funktion wie jede andere angesprochen werden:

C#

[Bearbeiten |Quelltext bearbeiten]
usingSystem;usingSystem.Runtime.InteropServices;namespaceDllImportBeispiel{classProgram{[DllImport("Example.dll")]staticexterndoubleAddNumbers(doublea,doubleb);staticvoidMain(){Console.WriteLine(AddNumbers(1,2));}}}

VB.NET

[Bearbeiten |Quelltext bearbeiten]
ImportsSystem.Runtime.InteropServicesClassProgram<DllImport("Example.dll")>_PrivateSharedFunctionAddNumbers(aAsDouble,bAsDouble)AsDoubleEndFunctionPrivateSharedSubMain()Console.WriteLine(AddNumbers(1,2))EndSubEndClass

Direkte Einbindung von DLLs in Visual Studio

[Bearbeiten |Quelltext bearbeiten]

Wenn jedoch auf mehrere Methoden oder Funktionen einer DLL zugegriffen werden soll, kann diese auch über den Projekt Explorer vonVisual Studio direkt eingebunden werden.[5] Anschließend können die Funktionen der DLL verwendet werden, indem man entweder im Code den vollständigen 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 benötigt.

Im Folgenden ist obiges Beispiel mit direkt eingebundener DLL veranschaulicht (der Namespace entspricht hier dem Namen der DLL):

C#
[Bearbeiten |Quelltext bearbeiten]
usingExample;classProgram{staticvoidMain(){Console.WriteLine(AddNumbers(1,2));}}
VB.Net
[Bearbeiten |Quelltext bearbeiten]
ImportsExampleClassProgramPrivateSharedSubMain()Console.WriteLine(AddNumbers(1,2))EndSubEndClass

Siehe auch

[Bearbeiten |Quelltext bearbeiten]
  • Dependency 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

[Bearbeiten |Quelltext bearbeiten]

Einzelnachweise

[Bearbeiten |Quelltext bearbeiten]
  1. Was ist Dynamic Link Library (DLL)? - Definition von WhatIs.com. Abgerufen am 24. Mai 2022. 
  2. DLL-Datei - was ist das? Abgerufen am 24. Mai 2022. 
  3. abK. B. Microsoft:Executable-File Header Format
  4. Deland-Han: Dynamic Link Library (DLL) - Windows Client. Abgerufen am 24. Mai 2022 (deutsch). 
  5. 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&oldid=258707012
Kategorie:

[8]ページ先頭

©2009-2026 Movatter.jp