Statisches vs dynamisches Laden von DLLs mit Delphi

Eine DLL (Dynamic Link Library) fungiert als gemeinsam genutzte Bibliothek von Funktionen, die von zahlreichen Anwendungen und anderen DLLs aufgerufen werden können. Delphi lässt Sie Erstellen und Verwenden von DLLs damit Sie diese Funktionen nach Belieben aufrufen können. Sie müssen diese Routinen jedoch importieren, bevor Sie sie aufrufen können.

Aus einer DLL exportierte Funktionen können auf zwei Arten importiert werden: entweder durch Deklarieren einer externen Prozedur oder Funktion (statisch) oder durch direkte Aufrufe von DLL-spezifischen API-Funktionen (dynamisch).

Betrachten wir eine einfache DLL. Unten ist der Code für "circle.dll", der eine Funktion namens "CircleArea" exportiert, die die Fläche eines Kreises unter Verwendung des angegebenen Radius berechnet:

Sobald Sie die circle.dll haben, können Sie die exportierte "CircleArea" -Funktion aus Ihrer Anwendung verwenden.

Statisches Laden

Der einfachste Weg, eine Prozedur oder Funktion zu importieren, besteht darin, sie mit der externen Direktive zu deklarieren:

instagram viewer

Wenn Sie diese Deklaration in den Schnittstellenteil einer Einheit aufnehmen, wird circle.dll beim Programmstart einmal geladen. Während der Ausführung des Programms steht die Funktion CircleArea allen Einheiten zur Verfügung, die die Einheit verwenden, in der sich die obige Deklaration befindet.

Dynamisches Laden

Sie können über direkte Aufrufe von Win32-APIs auf Routinen in einer Bibliothek zugreifen, einschließlich LoadLibrary, FreeLibrary, und GetProcAddress. Diese Funktionen sind in Windows.pas deklariert.

So rufen Sie die CircleArea-Funktion mithilfe des dynamischen Ladens auf:

Beim Importieren mit dynamischem Laden wird die DLL erst beim Aufruf von LoadLibrary geladen. Die Bibliothek wird von der entladen Rufen Sie FreeLibrary an.

Beim statischen Laden wird die DLL geladen und ihre Initialisierungsabschnitte werden ausgeführt, bevor die Initialisierungsabschnitte der aufrufenden Anwendung ausgeführt werden. Dies wird bei dynamischer Belastung umgekehrt.

Sollten Sie statisch oder dynamisch verwenden?

Hier ein einfacher Blick auf die Vor- und Nachteile des statischen und dynamischen Ladens von DLLs:

Statisches Laden

Vorteile:

  • Einfacher für Anfänger; kein "hässliches" API-Aufrufe.
  • DLLs werden beim Programmstart nur einmal geladen.

Nachteile:

  • Die Anwendung wird nicht gestartet, wenn DLLs fehlen oder nicht gefunden werden können. Eine Fehlermeldung wie diese wird angezeigt: "Diese Anwendung konnte nicht gestartet werden, da 'missing.dll' nicht gefunden wurde. Eine Neuinstallation der Anwendung könnte das Problem lösen". Die DLL-Suchreihenfolge mit statischer Verknüpfung enthält standardmäßig das Verzeichnis, aus dem die Anwendung stammt geladen, das Systemverzeichnis, das Windows-Verzeichnis und die in der PATH-Umgebung aufgelisteten Verzeichnisse Variable. Beachten Sie auch, dass die Suchreihenfolge für verschiedene Windows-Versionen unterschiedlich sein kann. Erwarten Sie immer, dass sich alle DLLs in dem Verzeichnis befinden, in dem sich die aufrufende Anwendung befindet.
  • Es wird mehr Speicher verwendet, da alle DLLs geladen sind, auch wenn Sie einige der .functions nicht verwenden

Dynamisches Laden

Vorteile:

  • Sie können Ihr Programm auch dann ausführen, wenn einige der verwendeten Bibliotheken nicht vorhanden sind.
  • Geringerer Speicherverbrauch, da die DLLs nur bei Bedarf verwendet werden.
  • Sie können den vollständigen Pfad zur DLL angeben.
  • Kann für modulare Anwendungen verwendet werden. Die Anwendung stellt nur Module (DLLs) zur Verfügung, die für den Benutzer "genehmigt" wurden.
  • Die Möglichkeit, Bibliotheken dynamisch zu laden und zu entladen, ist die Grundlage eines Plug-in-Systems, mit dem Entwickler Programmen zusätzliche Funktionen hinzufügen können.
  • Abwärtskompatibilität mit älteren Windows-Versionen, in denen System-DLLs möglicherweise nicht dieselben Funktionen unterstützen oder auf dieselbe Weise unterstützt werden. Wenn Sie zuerst die Windows-Version erkennen und dann basierend auf der Ausführung Ihrer App dynamisch verknüpfen, können Sie mehr unterstützen Windows-Versionen und bieten Problemumgehungen für ältere Betriebssysteme (oder zumindest das ordnungsgemäße Deaktivieren von Funktionen, die Sie nicht können Unterstützung.)

Nachteile:

  • Benötigt mehr Code, was für Anfänger nicht immer einfach ist.