Eine dynamische Linkbibliothek ist eine Sammlung von Prozeduren und Funktionen, die von Anwendungen und anderen DLLs aufgerufen werden können. Sie enthält öffentlichen Code oder Ressourcen. Da der DLL-Code die Speicherfreigabetechnologie verwendet, gewährt Windows der DLL an einigen Stellen auch einige höhere Berechtigungen, sodass die DLL einige Funktionen implementieren kann, die von normalen Programmen nicht erreicht werden können, z. B. die Implementierung von Windows HOOK, ISAPI usw. Gleichzeitig bietet DLL auch eine praktische Möglichkeit zur Codefreigabe zwischen verschiedenen Sprachen. Daher wird DLL häufig in der Programmierung verwendet. In diesem Artikel wird erläutert, wie man DLL in Delphi erstellt und verwendet.
eins. Speicherfreigabemechanismus der DLL-Bibliothek
Aus Sicht der Verwendung sind DLL und Unit sehr ähnlich. Sie können beide von anderen Projektmodulen aufgerufen werden, es gibt jedoch Unterschiede in ihren internen Implementierungsmechanismen. Wenn ein Programmmodul eine use-Anweisung verwendet, um auf eine Einheit zu verweisen, kompiliert der Compiler das Modul zusammen mit der Einheit und verknüpft den kompilierten ausführbaren Code mit dem Programmmodul. So kann ein Programmmodul aufgerufen werden Prozeduren und Funktionen in der referenzierten Einheit. Wenn mehrere Projekte auf dieselbe Einheit verweisen, enthält jedes Projekt den ausführbaren Code der Einheit. Wenn mehrere Projekte, die die Einheit enthalten, gleichzeitig ausgeführt werden, wird der ausführbare Code der Einheit mehrmals aktualisiert, wenn verschiedene Projekte übertragen werden in den Speicher, was zu einer Verschwendung von Speicherressourcen führt. Eine DLL ist anders, auch wenn sie von einem bestimmten Projekt aufgerufen wird. Das heißt, eine DLL-Bibliothek bildet nach der Kompilierung eine separate ausführbare Datei und ist nicht mit einer anderen ausführbaren Datei verbunden Die DLL-Bibliothek ist keinem bestimmten Projekt untergeordnet. Wenn mehrere Projekte dieselbe DLL-Bibliothek aufrufen, überträgt nur das erste Projekt die DLL-Bibliothek wiederholt in den Speicher gleichen gemeinsamen Speicherbereich. Darüber hinaus wird der Ausführungscode der DLL dynamisch während der Ausführung des Programms übertragen, anstatt zusammen mit dem gesamten Projekt während der Ausführung des Programms in den Speicher übertragen zu werden. Dadurch können die durch die Einheit verursachten Nachteile beseitigt werden, dass derselbe Code an mehreren Stellen Speicher belegt.
2. Erstellung einer DLL-Bibliothek in Delphi
In der Delphi-Umgebung unterscheidet sich das Schreiben einer DLL nicht wesentlich vom Schreiben einer allgemeinen Anwendung. Tatsächlich erfordert das Schreiben von DLL-Funktionen als Hauptteil der DLL außer Unterschieden in der Speicher- und Ressourcenverwaltung keine weiteren besonderen Mittel.
Das Format allgemeiner Projektdateien ist:
PROgram-Projekttitel;
used-Klausel;
Programmkörper
Das Format der DLL-Projektdateien ist:
Titel des Bibliotheksprojekts;
used-Klausel;
Exprots-Klausel;
Programmkörper
Es gibt zwei Hauptunterschiede zwischen ihnen:
1. Im Allgemeinen verwendet der Header von Projektdateien das Schlüsselwort „Programm“, während der Header von DLL-Projektdateien das Schlüsselwort „Library“ verwendet. Verschiedene Schlüsselwörter weisen den Compiler an, unterschiedliche ausführbare Dateien zu generieren. Das Schlüsselwort „Programm“ wird zum Generieren einer EXE-Datei und das Schlüsselwort „Bibliothek“ zum Generieren einer DLL-Datei verwendet.
2. Wenn die DLL Funktionen oder Prozeduren zur Verwendung durch andere Anwendungen exportieren möchte, müssen diese Funktionen oder Prozeduren in der Exportklausel aufgeführt sein. Diese Funktionen oder Prozeduren selbst müssen mit der Export-Kompilierungsanweisung kompiliert werden.
Wählen Sie das Element „Neu...“ in der Delphi-Hauptmenüdatei aus, doppelklicken Sie auf das DLL-Symbol im Popup-Fenster. Das DLL-Quellmodul-Framework wird automatisch wie folgt angezeigt:
Bibliotheksprojekt1;
{...Anmerkung...}
verwendet
SysUtils,Classes;
beginnen
Ende.
Als nächstes können Sie die Definitionen der Prozeduren und Funktionen, die Sie in der DLL implementieren möchten, zwischen USES und begin hinzufügen und sie mit export und exports exportieren, damit andere Module zwischen begin und end darauf verweisen können wird zum Initialisieren von DLL-Variablen verwendet. Es ist zu beachten, dass Anfang und Ende nicht weggelassen werden können, auch wenn kein Initialisierungscode vorhanden ist, wie im folgenden Beispiel:
Bibliothekminmax;
functionMin(X,Y:Integer):Integer;export;
beginnen
ifX<YthenMin:=XelseMin:=Y;
Ende;
functionMax(X,Y:Integer):Integer;export;
beginnen
ifX>YthenMax:=XelseMax:=Y;
Ende;
Exporte
Minindex1,
Maxindex2;
beginnen
Ende.
Nach dem Kompilieren und Speichern als minmax.DLL wird eine DLL-Bibliotheksdatei erstellt.
Zugriff auf drei DLL-Bibliotheken
Es gibt zwei Möglichkeiten, auf die DLL-Bibliothek zuzugreifen: eine als statische Referenz und die andere als dynamische Referenz.
Das Laden einer DLL mithilfe einer statischen Referenzmethode erfordert zwei Dinge: das Erstellen einer Eingabeeinheit für die DLL-Bibliothek und die Verwendung von USES, um die Eingabeeinheit mit dem Programmmodul zu verbinden, das die DLL-Funktionen verwendet. Der einzige Unterschied zwischen der für die DLL-Bibliothek erstellten Eingabeeinheit und der gewöhnlichen Einheit besteht darin, dass die an ihrer Schnittstelle deklarierten Prozeduren und Funktionen nicht den tatsächlichen Implementierungscode in ihrem Implementierungsteil enthalten. Stattdessen wird das externe Schlüsselwort zum Deklarieren der Prozeduren und verwendet Die Implementierungsdetails werden an externe DLL-Module delegiert.
Die Syntax für die Verwendung des externen Befehls lautet wie folgt:
Prozedur-/Funktionsname; externalDLL-Modulname;
Das Folgende ist die Eingabeeinheits-Quelldatei testdll.pas, die für die oben erstellte minmax.DLL-Bibliothek geschrieben wurde. Daraus können wir einige Unterschiede zwischen der Eingabeeinheit und der allgemeinen Einheit erkennen.
unittestdll;
Schnittstelle
verwendet
functionMin(X,Y:Integer):Integer;
functionMax(X,Y:Integer):Integer;
Durchführung
functionMin;external'minmax.DLL';
functionMax;external'minmax.DLL';
Ende.
Wenn eine Anwendung eine Funktion in minmax.DLL aufrufen möchte, muss sie lediglich die testdll-Einheit zu ihrer use-Anweisung hinzufügen.
Für das dynamische Laden einer DLL sind drei API-Funktionen von Windows erforderlich. Loadlibrary, Freelibrary und GetprocAddress. Die Loadlibrary-Funktion wird zum Laden der DLL-Bibliothek verwendet. Ihr Aufrufformat ist wie folgt:
functionloadlobrary(DLLfileName:Pchar):THandle:
Wenn eine DLL-Bibliothek nicht mehr benötigt wird, sollte die FreeLibrary-Funktion aufgerufen werden, um sie freizugeben und wertvolle Speicherressourcen freizugeben. Das Aufrufformat ist wie folgt:
procedureFreeLibrary(Libmodule:THandle)
Libmodule ist das DLL-Bibliothekshandle, das durch den LoadLibrary-Aufruf erhalten wird. Im Programmabschnitt zwischen dem Laden einer DLL-Bibliothek mit der Loadlobrary-Funktion und dem Aufruf von FreeLibrary zum Freigeben der DLL-Bibliothek können Sie die Prozeduren und Funktionen in der DLL-Bibliothek verwenden. Die spezifische Verwendungsmethode ist: Verwenden Sie die Funktion GetprocAddress, um die Adresse abzurufen Übergeben Sie die Funktion in der DLL-Bibliothek an eine Funktionsvariable im Programm und verwenden Sie dann die Variable, um die DLL-Funktion aufzurufen. Die GetprocAddress-Funktion wird wie folgt deklariert:
functionGetprocAddress(Libmodule:THandle:procname:pchar):TFarProc:
Wie im folgenden Beispiel gezeigt:
Typ
TTimeRec=Aufzeichnung
Zweitens:Ganzzahl;
Minute:Integer;
Stunde:Ganzzahl;
Ende;
TGetTime=procedure(varTime:TTimeRec);
THandle=Integer;
var
Zeit:TTimeRec;
Griff:THandle;
GetTime:TGetTime;
...
beginnen
Handle:=LoadLibrary('DATETIME.DLL');
ifHandle<>0then
beginnen
@GetTime:=GetProcAddress(Handle,'GetTime');
if@GetTime<>nilthen
beginnen
GetTime(Zeit);
mitTimedo
WriteLn('Thetimeis',Hour,':',Minute,':',Second);
Ende;
FreeLibrary(Handle);
Ende;
Ende;
Beim Aufruf der Dynamic Link Library ist zu beachten, dass sich die benötigte Dynamic Link Library im gleichen Verzeichnis wie die Anwendung oder im WindowsSystem-Verzeichnis befinden muss.
Dynamische Linkbibliotheken sind eine wichtige Möglichkeit, Programme unter Windows zu organisieren. Die Verwendung dynamischer Linkbibliotheken kann die von Benutzern in verschiedenen Entwicklungstools und in verschiedenen Zeiträumen geleistete Arbeit erheblich schützen und die Programmiereffizienz verbessern.