1. Starten Sie Ihr erstes DLL -Projekt
1. Datei-> All-> Datei-> neu [dll >
Code : |
// generieren Sie den Code automatisch wie folgt Bibliotheksprojekt2; // Das ist Unsinn. Verwendung SYSUTILS, Klassen; {$ R *.res} Beginnen Ende. |
2. Fügen Sie einen Funk hinzu, um einzugeben:
Code : |
Bibliotheksprojekt2; Verwendung SYSUTILS, Klassen; Funktion MYMAX (x, y: Ganzzahl): Ganzzahl; Beginnen Wenn x> y dann Ergebnisse: = x anders Ergebnisse: = y; Ende ; // Denken Sie daran: Der Name der Bibliothek spielt keine Rolle, aber der Fall von DLL-Func ist verwandt. // MYMAX in dll-funcname zu schreiben unterscheidet sich von MYMAX. Wenn es falsch geschrieben ist, sofort // Das Ergebnis ist, dass Sie darum bitten, dass der AP, der diese DLL verwendet, überhaupt nicht geöffnet werden kann. // Der obere und untere Fall der Parameter ist in Ordnung. Es muss nicht einmal denselben Namen haben. Wenn der Prototyp ist (x, y: Ganzzahl) // Schreiben Sie es als (a, b: Ganzzahl) rechtzeitig, das ist in Ordnung. // Denken Sie daran: Fügen Sie eine weitere Stdcall hinzu. Das Buch besagt, dass wenn Sie DLLs mit Delphi schreiben und nicht nur darauf hoffen // Wenn delphi-ap auch hofft, BCB/VC-AP usw. zu verwenden, sollten Sie besser eine stdcall hinzufügen. // Parametermuster: Delphi hat viele variable Muster, die natürlich nicht das sind, was DLL mag // Die Muttersprache von Windows/DLL sollte C sein C. Wenn wir also die Parameter der DLL ein- und ausgeben wollen // Verwenden Sie so viel wie möglich nach den Regeln. Wenn Sie diese beiden schreiben, werden letztere große Probleme haben. Wenn Sie mit C nicht vertraut sind // Wenn das in Ordnung ist. Wir werden später darüber sprechen. {$ R *.res} Beginnen Ende. |
3. Senden Sie diese gemeinsam genutzbaren Funktionen aus der DLL und lassen Sie die Außenwelt (es ist Ihr Delphi): Guangru: Guangru
Daher kann Ihr AP diese nicht verwenden, Sie müssen Exporte hinzufügen.
Code : |
{$ R *.res} Exporte MYMAX; Beginnen Ende. |
4. Okay, Sie können Strg-F9 drücken, um zu kompilieren. Drücken Sie zu diesem Zeitpunkt nicht F9. DLL ist nicht exe┌, das nicht separat ausgeführt werden kann. Wenn die DLL zu diesem Zeitpunkt einen Fehler hat, korrigieren Sie ihn bitte. Drücken Sie erneut Strg-F9. Warnung kann zu diesem Zeitpunkt da sein. Es spielt keine Rolle, studieren Sie es einfach und schauen Sie sich an. Drücken Sie erneut Strg-F9 und dann "fertig, zusammengestellt". Es wird ein *.dll im selben Verzeichnis geben. Herzlichen Glückwunsch, die Aufgabe ist erledigt.
2. Führen Sie einen Test durch: Öffnen Sie eine neue Anwendung:
1. Fügen Sie einen Tbutton hinzu
Code : |
ShowMessage (inttostr (MYMAX (30,50))); |
2. Sagen Sie Exe, dorthin zu gehen, um einen Func zu fangen
Code : |
// Form, Schnittstelle, var hinzufügen Funktion MYMAX (X, Y: Ganzzahl): Integer; // myTestDll.dll schreibt den DLL -Projektnamen für Sie vorher für Sie // Es spielt keine Rolle, ob der DLL -Name oberen und niedriger ist. Aber denken Sie daran, Erweiterung .dll hinzuzufügen. Auf Win95 oder NT, // Es besteht keine Notwendigkeit, Erweiterung hinzuzufügen, aber diese beiden OSS sind möglicherweise immer weniger. Sie müssen Erweiterung hinzufügen. |
OK, es ist einfach.
Ist das obige Beispiel sehr einfach? Freunde, die mit Delphi vertraut sind, können sehen, dass der obige Code im Grunde genommen das gleiche ist wie das Schreiben eines allgemeinen Delphi -Programms, außer dass nach der TestDll -Funktion ein zusätzlicher STDCall -Parameter vorhanden ist und die TestDll -Funktion mithilfe der Exporte -Anweisung deklariert wird. Kompilieren Sie einfach den obigen Code und Sie können eine dynamische Linkbibliothek namens Delphi.dll erhalten. Lassen Sie uns nun sehen, was Aufmerksamkeit braucht. 1. Alle in DLL geschriebenen Funktionen oder Verfahren müssen mit STDCall -Anrufparametern hinzugefügt werden. In Delphi 1 oder Delphi 2 Umgebung ist der Anrufparameter weit. Nach Delphi 3 wurde dieser Parameter in STDCall geändert, um die Standard -WIN32 -Parametertransfertechnologie anstelle der optimierten Registerparameter zu verwenden. Vergessen, den STDCall -Parameter zu verwenden, ist ein häufiger Fehler. Der Grund dafür ist, dass der Parameter Register der Standardparameter von Delphi ist.
2. Die geschriebenen Funktionen und Verfahren sollten als externe Funktionen unter Verwendung der Exportanweisung deklariert werden.
Wie Sie sehen können, wird die TestDll -Funktion als externe Funktion deklariert. Dadurch kann die Funktion extern erkennen. (Wenn es keine Schnellansichtsoption gibt, können Sie sie über eine Windows -CD installieren.) Die TestDll -Funktion wird in der Exporttabellenleiste angezeigt. Ein weiterer guter Grund ist, dass, wenn wir nicht so deklarieren, die Funktionen, die wir schreiben, nicht aufgerufen werden, was niemand sehen möchte.
3. Wenn Parameter und Variablen von Long String Type verwendet werden, sollte Sharemem referenziert werden.
Der String -Typ in Delphi ist sehr mächtig. (Ja, Sie haben es richtig gelesen, es sind in der Tat zwei Megabyte.) Wenn Sie zu diesem Zeitpunkt darauf bestehen, einen String -Typ -Parameter, eine Variable oder sogar Aufzeichnungsinformationen zu verwenden, müssen Sie sich auf die Sharemem -Einheit beziehen, und es muss die erste Referenz sein . Es ist die erste referenzierte Einheit nach der Verwendungsanweisung. Wie im folgenden Beispiel gezeigt:
Verwendung
Sharemem,
SYSUTILS,
Klassen;
Ein weiterer Punkt ist, dass dasselbe in Ihrer Projektdatei (*.dpr) anstelle der Einheitsdatei (*.pas) durchgeführt werden sollte. Wenn Sie dies nicht tun, zahlen Sie wahrscheinlich einen Absturz. Die Möglichkeit, den String -Typ zu vermeiden, besteht darin, Parameter, Variablen usw. des String -Typs als PCHR oder Shortstring (z. B.: s: String [10]) zu deklarieren. Das gleiche Problem tritt auf, wenn Sie dynamische Arrays verwenden. Die Lösung ist wie oben beschrieben.
Kapitel 3: Statischer Anruf bei DLL Top in Delphi
Das Aufrufen einer DLL ist einfacher als eine DLL zu schreiben. Zunächst werde ich Ihnen die statische Aufrufmethode vorstellen. Lassen Sie uns zunächst ein Beispiel für statische Anrufe geben.
Einheit Einheit1;
Schnittstelle
Verwendung
Fenster, Nachrichten, Systeme, Klassen, Grafiken,
Steuerelemente, Formulare, Dialoge, STDCtrls;
Typ
Tform1 = Klasse (tform)
Edit1: tedit;
Button1: Tbutton;
PROCEDURE Taste1Click (Absender: Tobject);
Privat
{Private Deklarationen}
öffentlich
{Öffentliche Erklärungen}
Ende;
var
Form1: tform1;
Durchführung
{$ R *.dfm}
// Der folgende Code in dieser Zeile ist der Code, den wir wirklich geschrieben haben
Funktion testDll (i: Ganzzahl): Integer; stdcall;
externe 'delphi.dll';
procedure tform1.button1click (Absender: tobject);
Beginnen
Edit1.text: = inttoStr (testDll (1));
Ende;
Ende.
Im obigen Beispiel haben wir ein Bearbeitungsfeld (Bearbeiten) und eine Schaltfläche im Formular platziert und nur sehr wenig Code geschrieben, um die von uns gerade geschriebene Delphi.dll zu testen. Sie können sehen, dass der einzige Job, den wir machen, den Beschreibungsteil der TestDll -Funktion in die Implementierung einfügen und den Ort von Delphi.dll mit der externen Anweisung angeben. (In diesem Beispiel befinden sich das Anrufprogramm und Delphi.dll im selben Verzeichnis.) Es ist aufregend, dass die von uns selbst geschriebene Testdll -Funktion von Delphi schnell erkannt wurde. Sie können ein solches Experiment durchführen: Geben Sie "testDll (" ein, und bald wird Delphi die Fly-by-Eingabeaufforderung verwenden, um Ihnen aufzufordern, welche Parameter Sie eingeben sollten, genauso einfach wie die Verwendung anderer in Delphi definierter Funktionen. Hinweise enthalten Hinweise.
Nächste:
1. Verwenden Sie STDCall, um Parameter aufzurufen.
Wie oben erwähnt, müssen Sie bei Bezug auf Funktionen und Prozeduren in DLL auch den STDCall -Parameter verwenden, wie oben erwähnt.
2. Verwenden Sie die externe Anweisung, um den Pfad und den Namen der aufgerufenen DLL -Datei anzugeben.
Wie Sie sehen können, geben wir den Namen der DLL -Datei an, die in der externen Anweisung aufgerufen werden soll. Es gibt keinen Schreibpfad, da die DLL -Datei und das Hauptprogramm, das sie genannt hat, im selben Verzeichnis befindet. Wenn sich die DLL -Datei in C:/befindet, können wir die obige Referenzanweisung als externes 'C: /delphi.dll' schreiben. Beachten Sie, dass das suffix.dll der Datei geschrieben werden muss.
3. Globale Variablen können nicht aus der DLL aufgerufen werden.
Wenn wir eine globale Variable in der DLL deklarieren, wie z. B.: var s: byte. Auf diese Weise können die globalen Variablen s normal in der DLL verwendet werden, aber S kann nicht vom Anrufprogramm verwendet werden, und S kann nicht als globale Variable an das Anrufprogramm übergeben werden. Variablen, die im Anrufprogramm deklariert sind, können jedoch als Parameter an die DLL übergeben werden.
4. Die genannte DLL muss existieren.
Dies ist wichtig. Wenn der angegebene Pfad und der Dateiname nicht vorhanden sind oder der angegebene Pfad und der Dateiname falsch sind, fordert das System auf, "einen Fehler beim Starten des Programms aufgetreten" oder "Nicht gefunden *.dll -Datei" beim Ausführen des Hauptprogramms.
Kapitel 4 Dynamisch DLL Top in Delphi aufrufen
Das dynamische Aufrufen von DLLs ist relativ kompliziert, aber sehr flexibel. Um das Problem gründlich zu veranschaulichen, geben wir diesmal ein Beispiel dafür, eine in C ++ geschriebene DLL aufzurufen. Kompilieren Sie zunächst das folgende DLL -Quellprogramm in C ++.
#enthalten
extern "C" _declspec (dllexport)
int Winapi testc (int i)
{
kehre I zurück;
}
Nach der Kompilierung wird eine DLL -Datei generiert. Aus Gründen der Bequemlichkeit verweisen wir weiterhin auf das obige Anrufprogramm, ersetzen jedoch die ursprüngliche Anweisung im Button1click -Prozess durch den folgenden Code.
procedure tform1.button1click (Absender: tobject);
Typ
Tintfunc = Funktion (i: Ganzzahl): Ganzzahl; stdcall;
var
Th: Thandle;
TF: Tintfunc;
TP: TFARPROC;
Beginnen
Th: = loadlibrary ('cpp.dll');
Wenn th> 0 dann
versuchen
TP: = GetProcaddress (th, pchar ('testc'));
Wenn tp <> nil
Dann fangen Sie an
Tf: = tintfunc (tp);
Edit1.text: = inttoStr (tf (1));
Ende
anders
ShowMessage ('TestC -Funktion nicht gefunden');
Endlich
Freelibrary (th);
Ende
anders
ShowMessage ('cpp.dll nicht gefunden');
Ende;
Wie Sie gesehen haben, ist diese dynamische Anruftechnik sehr kompliziert, aber solange Sie die Parameter ändern, z. Dll genannt.
1. Definieren Sie den Typ der zu aufgerufenen Funktion oder der zu aufgerufenen Verfahren.
Im obigen Code definieren wir einen Tintfunc -Typ, der dem Funktionstest entspricht, den wir aufrufen werden. Die gleiche Definitionsarbeit sollte in anderen Anrufen durchgeführt werden. Fügen Sie auch STDCall -Anrufparameter hinzu.
2. Lösen Sie die angerufene DLL.
Wir haben eine DLL dynamisch mit Loadlibrary angerufen, aber denken Sie daran, dass Sie die DLL nach der Verwendung manuell mit freiem Freelibrary loslassen müssen, da die DLL ansonsten Speicher aufnimmt, bis Sie Fenster beenden oder herunterfahren.
Bewerten wir nun die Vor- und Nachteile der beiden Anrufmethoden der DLL. Die statische Methode ist einfach zu implementieren, einfach zu meistern und im Allgemeinen etwas schneller und ist sicherer und zuverlässiger. Zum Ausführen bis zur DLL nur am Ende des Programms veröffentlicht, und nur Compiler-basierte Systeme wie Delphi können diese Methode verwenden. Dynamische Methoden lösen die Mängel in statischen Methoden besser und können in DLLs leicht auf Funktionen und Verfahren zugreifen, und sogar neu hinzugefügte Funktionen oder Verfahren in einigen alten Versionen von DLLs Funktion oder Prozedur muss viele komplexe Typen und Aufrufmethoden definieren. Für Anfänger empfiehlt der Autor, dass Sie statische Methoden anwenden und dann dynamische Aufrufmethoden verwenden, nachdem Sie kompetent sind.
Kapitel 5 Praktische Tipps zur Verwendung von DLL Top
1. Schreibfähigkeiten.
1. Um die Richtigkeit der DLL zu gewährleisten, können Sie sie zuerst als Teil einer gewöhnlichen Anwendung schreiben, sie korrekt debuggen und dann vom Hauptprogramm trennen und in DLL kompilieren.
2. Um die Universalität der DLL zu gewährleisten, sollten Sie verhindern, dass die Namen der visuellen Steuerelemente in der DLL erscheinen, die Sie selbst geschrieben haben, wie z. einige Aufzeichnungen.
3. Um das Debuggen zu erleichtern, sollte jede Funktion und jeder Prozess so kurz und präzise wie möglich sein und von spezifischen und detaillierten Anmerkungen begleitet werden.
V.
5. Referenz so wenige Einheiten wie möglich, um die Größe der DLL zu verringern, insbesondere nicht auf visuelle Einheiten, wie z. B. Dialoge. Im Allgemeinen können wir im Allgemeinen keine Einheiten der Klassen verweisen, die die kompilierte DLL um etwa 16 KB reduzieren können.
2. Rufen Sie Fähigkeiten an.
1. Wenn Sie statische Methoden verwenden, können Sie die aufgerufene Funktion oder Prozedur umbenennen. In dem oben erwähnten DLL -Beispiel, das oben erwähnt wurde, wird C ++ einige seltsame Funktionsnamen kompilieren, und die ursprüngliche Test -Funktion wird @testc $ s und andere lächerliche seltsame Namen dauern. Verwendet C ++ - Name Mangling -Technologie. Dieser Funktionsname ist in Delphi illegal. Wir können dieses Problem wie folgt lösen:
Schreiben Sie die Referenzfunktion als um
Funktionstestc (I: Ganzzahl): Ganzzahl; stdcall;
externe 'cpp.dll'; name '@testc $ s';
Die Funktion des Namens ist umbenannt.
2. Sie können die DLLs, die wir in das Windows -Verzeichnis oder das Windows/System -Verzeichnis geschrieben haben. Dies kann nur den Namen der DLL schreiben, ohne den Pfad in die externe Anweisung oder in der Lastlibrary -Anweisung zu schreiben. Es ist jedoch ein bisschen unangemessen, dies zu tun. Setzen Sie die DLLs, die Sie selbst geschrieben haben, in das Systemverzeichnis!
3.. Debugging -Fähigkeiten.
1. Wir wissen, dass DLL beim Schreiben nicht ausgelegt und debuggen kann. Es gibt eine Möglichkeit, dies zu tun, das heißt, ein Host -Programm im Menü Run | Parameter einzurichten. Fügen Sie den Namen des Host-Programms zur Host-Anwendungsleiste der lokalen Seite hinzu, um schrittweise Debugging, Breakpoint-Beobachtung und Laufen durchzuführen.
2. Fügen Sie DLL -Versionsinformationen hinzu. In den Eröffnungsbemerkungen wird erwähnt, dass Versionsinformationen für DLLs sehr wichtig sind. Es lohnt sich, einen so kleinen Platz hinzuzufügen. Leider ist es nicht möglich, die Versionsoption im Projekt -Optionsmenü direkt zu verwenden. Wie im folgenden Beispiel gezeigt:
Bibliothek Delphi;
Verwendung
SYSUTILS,
Klassen;
{$ R *.res}
// Beachten Sie, dass die obige Codezeile in dieser Position hinzugefügt werden muss
Funktion testDll (i: Ganzzahl): Integer; stdcall;
Beginnen
Ergebnisse: = i;
Ende;
Exporte
Testdll;
Beginnen
Ende.
3. Um das Duplizieren der Namen mit anderen DLLs zu vermeiden, verwenden Sie am besten eine Mischung aus Zeichen, Zahlen und Unterstrichen, wenn Sie die von Ihnen geschriebenen DLLs benennen. Zum Beispiel: jl_try16.dll.
4. Wenn Sie bereits einige DLLs in Delphi 1 oder Delphi 2 zusammengestellt haben, ist die von Ihnen zusammengestellte DLL 16-Bit. Kompilieren Sie einfach den Quellcode in der Umgebung Neues Delphi 3 oder Delphi 4 und Sie können eine 32-Bit-DLL erhalten.
[Nach Anmerkung]: Zusätzlich zu den am häufigsten verwendeten Methoden zur Verwendung von DLLs können DLLs als Ressourcenträger verwendet werden. Das Ändern von Symbolen in Windows ist beispielsweise die Ressource in der verwendeten DLL. Darüber hinaus bietet die Mastered DLL Design -Technologie viele Vorteile für die Verwendung fortschrittlicherer Programme von OLE, COM und ActiveX.