Static Wikipedia February 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Web Analytics
Cookie Policy Terms and Conditions Dynamic Link Library - Wikipedia

Dynamic Link Library

aus Wikipedia, der freien Enzyklopädie

Dynamic Link Library (DLL) bezeichnet allgemein eine Dynamische Bibliothek, meist bezieht sich der Begriff jedoch auf die unter dem Betriebssystem Microsoft Windows verwendete Variante.

Windows-DLL-Dateien verwenden das auch für ausführbare Windows-Programme gebräuchliche EXE-Dateiformat. Sowohl EXE- als auch DLL-Dateien können Programmcode (Maschinencode), Daten, und Ressourcen, in irgendeiner Kombination enthalten.

Die Windows-Dateiendung für solche Bibliotheken ist gewöhnlich DLL, OCX (für Bibliotheken mit ActiveX Steuerelementen) oder ICL (für Bibliotheken, die nur Gerätebilder, sogenannte Icons, enthalten).

Inhaltsverzeichnis

[Bearbeiten] Hintergrund

Hauptartikel: Programmbibliothek

Der Zweck von DLL-Dateien ist, den von einer Anwendung auf der Festplatte und im Hauptspeicher benötigten Speicherplatz zu reduzieren. Jeglicher Programmcode, der von mehr als einer Anwendung benötigt werden könnte, wird deshalb in einer einzelnen Datei auf der Festplatte gespeichert und nur einmal in den Hauptspeicher geladen, wenn mehrere Programme dieselbe Programmbibliothek benötigten.

[Bearbeiten] Weitere Vorteile

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 Software-Entwicklern möglich, relativ kleine Patchs 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 von Plug-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 durch ActiveX realisiert.

[Bearbeiten] Schwächen

Ein in der Windows-Welt auch DLL Hell 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 Programmes kopiert wird. Der Effekt der Speicherersparnis wird dadurch allerdings wieder zunichte gemacht. Viele Betriebssysteme und unter Windows Microsoft .NET umgehen Probleme mit Versionskonflikten bei DLL-Dateien, indem sie die gleichzeitige Existenz von mehreren Versionen einer Programmbibliothek ermöglichen. Bei heutigen Computern mit ausreichend Arbeits- und Festplattenspeicher ist dies ein sinnvoller Weg, um der „DLL Hell“ vorzubeugen.

[Bearbeiten] Betriebssysteminterne Behandlung

[Bearbeiten] Laden von DLLs bei einem Programmstart

Wenn ein Programm ausgeführt werden soll, dann wird es vom Loader des Betriebssystems in den Speicher geladen und die Import-Table des Programmes 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-Table des Programmes die Einsprungadressen der einzelnen Befehle ein.

[Bearbeiten] DLL-Datei Aufbau

Eine DLL hat den selben PE-Header wie eine normale ausführbare Datei, nur ist im Characteristics-Wert das IMAGE_FILE_DLL-Bit gesetzt. Die DLL hat zusätzlich eine Export-Table, in der alle Namen der Befehle aufgelistet sind, die die DLL zur Verfügung stellt. Diese Namen müssen alphabetisch sortiert sein, damit der Loader sie finden kann.

[Bearbeiten] Aufruf eines DLL-Befehles durch ein Programm

Zuerst werden die zu übergebenden Werte auf dem Stack abgelegt, dann wird ein indirekter Sprung auf den Wert der vom Loader in der Import-Tabelle hinterlegten DLL-Adresse durchgeführt.

[Bearbeiten] DLLs im Speicher

Es gibt zwei verschiedene Arten, wie DLLs vom Betriebssystem in den Speicher geladen werden. Es gibt statische DLLs, die nur einmal geladen werden. Alle Programme greifen dann auf diese eine Instanz der DLL zu. Diese DLL hat dann nur einen 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). Die andere Art, wie eine DLL im Speicher verwaltet werden kann, ist die, dass jedes mal wenn ein neues Programm sie benötigt, auch eine neue Instanz von ihr in den Speicher geladen wird. Ob eine DLL statisch oder nicht ist legt ein weiteres Flag im Header der DLL fest.

[Bearbeiten] DLL-Instanzenzähler

Jedesmal, 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 braucht.

[Bearbeiten] Programmierbeispiele

[Bearbeiten] Arbeiten mit DLLs in Visual C++

[Bearbeiten] Erstellen einer DLL

Die DLL-Schnittstelle wird mit Hilfe der Export-Funktion __declspec(dllexport) definiert. Dies wird im folgendem Beispiel demonstriert:

#include <windows.h>

#if defined(_MSC_VER)
#define DLL extern "C" __declspec(dllexport)
#else
#define DLL
#endif
// nur unter MS VC das Symbol DLL definieren unter zum Beispiel  Linux wird DLL ignoriert

// Die Funktion, die anderen Programmen zur Verfügung gestellt werden soll
// (in diesem Beispiel: Addieren zweier Zahlen)
DLL double AddNumbers (double a, double b) {
        return a + b;
}

Dieses Beispiel erzeugt beim Compilieren sowohl eine DLL als auch eine LIB-Datei.

[Bearbeiten] Eine DLL einbinden / aufrufen

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 DLL
extern "C" __declspec(dllimport)double AddNumbers (double a, double b);

int main () {
        // 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 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, da diese - ähnlich einer Header Datei - die Funktionsprototypen enthält.

[Bearbeiten] Verwenden von DLLs mit Borland Delphi

[Bearbeiten] Erstellen einer DLL

Im Kopf des Quellcodes muss das Schlüsselwort 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 Verfügung gestellt werden soll
// (in diesem Beispiel: Addieren zweier Zahlen)
function AddNumbers(a, b: Double): Double; cdecl;
begin
  AddNumbers := a + b
end;

// Exportieren der Funktion
exports
  AddNumbers;

// In diesem Fall muss kein spezieller Initialisierungs-Quellcode angegeben werden
begin
end.

[Bearbeiten] Eine DLL einbinden / aufrufen

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

program Beispiel;
{$APPTYPE CONSOLE}

// Importieren der Funktion aus einer externen DLL
function AddNumbers(a, b: Double): Double; cdecl; external 'Example.dll';

var result: Double;
begin
  result := AddNumbers(1, 2);
  Writeln('Das Ergebnis ist: ', result)
end.

[Bearbeiten] Einbinden von DLLs zur Laufzeit

DLL-Bibliotheken können auf zwei verschiedene Weisen in eine Anwendung geladen werden, entweder mit dem Starten des Programmes (so wie in den obigen Beispielen beschrieben) oder während der Laufzeit, indem man die API-Funktionen LoadLibrary, GetProcAddress und FreeLibrary verwendet. Die Art und Weise, wie DLLs während der Laufzeit einzubinden sind, ist in jeder Programmiersprache gleich, solange man eine Windows API-Funktion importieren möchte. Der folgende Code demonstriert das anhand eines VC++ Beispieles:

#include <windows.h>
#include <stdio.h>

// Definition der DLL-Funktion, die verwendet werden soll
typedef double (*AddNumbers)(double, double);

int main () {
        AddNumbers function;
        double result;
        
        // DLL Datei laden
        HINSTANCE hinstLib = LoadLibrary("MyDll.dll");
        
        if (hinstLib) {
                // Die Einsprungadresse abfragen
                function = (AddNumbers) GetProcAddress(hinstLib, "AddNumbers");

                // Die Funktion aufrufen
                if (function)
                        result = (function) (1,2);

                // Die DLL-Datei wieder entladen
                BOOL fFreeResult = FreeLibrary(hinstLib);
        } 

        // Das Ergebnis anzeigen
        if (!hinstLib  || !function)
                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 benötigt. Die DLL-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 mit laden 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.

[Bearbeiten] DLLs in Visual Basic verwenden

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

Option Explicit
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: " & Result
End Sub

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 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 über eine zwischengeschaltete Wrapper-DLL möglich.

[Bearbeiten] Siehe auch

  • Dependency Walker, Bestandteil des Microsoft Visual Studio, mit dem man sich Funktionen die ein Programm ex- und importiert, hierarchisch anzeigen lassen kann.

[Bearbeiten] Links

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2006 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu