Die Erstellung einer DLL gliedert sich grundsätzlich in folgende Schritte:
1 Schreiben Sie eine Prozedur oder Funktion in ein DLL-Projekt
2 Schreiben Sie ein Exports-Schlüsselwort und schreiben Sie darunter den Namen der Prozedur. Es ist nicht erforderlich, Parameter und Aufrufsuffixe zu schreiben.
Zwei Parameter übergeben
1 Der Parametertyp sollte mit dem Parametertyp von Windows C++ übereinstimmen. Verwenden Sie nicht den DELPHI-Datentyp.
2 Es ist am besten, einen Rückgabewert zu haben [auch wenn es sich um eine Prozedur handelt], um den Erfolg oder Misserfolg des Aufrufs oder den Status zu melden. Der Rückgabewert für Erfolg oder Misserfolg ist vorzugsweise 1 [Erfolg] oder 0 [Fehler]. Kurz gesagt, es ist mit Windows C++ kompatibel.
3 Deklarieren Sie das Suffix mit stdcall.
4 Vorzugsweise Groß-/Kleinschreibung beachten.
5 Es ist nicht erforderlich, das Far-Calling-Suffix zu verwenden, es dient lediglich der Kompatibilität mit Windows-16-Bit-Programmen.
Initialisierung und Exit-Bereinigung von drei DLLs [falls Initialisierung und Exit-Bereinigung erforderlich sind]
1 DLLPRoc [ein Zeiger der SysUtils-Einheit] ist der Eingang zur DLL. Hier können Sie den Eintrag durch Ihre Funktion ersetzen. Ihre Funktion muss jedoch die folgenden Anforderungen erfüllen [eigentlich eine Rückruffunktion]. wie folgt:
procedure DllEnterPoint(dwReason: DWord);far;stdcall;
Es gibt vier Arten von dwReason-Parametern:
DLL_PROCESS_ATTACH: Wenn der Prozess eintritt
DLL_PROCESS_DETACH, wenn der Prozess beendet wird
DLL_THREAD_ATTACH, wenn der Thread eintritt
DLL_THREAD_DETACH, wenn der Thread beendet wird
Schreiben Sie im Abschnitt Initialisierung:
DLLProc := @DLLEnterPoint;
DllEnterPoint(DLL_PROCESS_ATTACH);
2 Wenn das Formular eine TdcomConnection-Komponente enthält, verwenden Sie „Uses Activex“ und schreiben Sie „CoInitialize (nil)“ während der Initialisierung;
3 Stellen Sie sicher, dass DcomConnection.Connected := False beim Beenden ist und der Datensatz geschlossen wurde. Andernfalls ist die gemeldete Adresse falsch.
Die Verwendung von vier globalen Variablen
Im Widnows 32-Bit-Programm sind die Adressräume der beiden Anwendungen nicht miteinander verknüpft. Obwohl die DLL eine Kopie im Speicher ist, befinden sich die Variablen im Adressraum jedes Prozesses, sodass Sie die globalen Variablen der DLL nicht zum Übertragen von Daten zwischen zwei Anwendungen verwenden können, es sei denn, Sie verwenden eine Speicherbilddatei.
5. Rufen Sie statisches Laden auf
1 Client-Funktionsdeklaration:
1) Groß- und Kleinschreibung beachten.
2) Identisch mit der Deklaration in der DLL.
Zum Beispiel: showform(form:Tform);Far;external'yproject_dll.dll';
3) Der beim Aufruf übergebene Parametertyp sollte mit Windows C++ identisch sein.
4) Beim Aufruf muss sich die DLL im Windows-Suchpfad befinden: Pfad „windows/system32“;
Sechs Aufrufe zum dynamischen Laden
1 Erstellen Sie einen Prozedurtyp [Wenn Sie sich darüber im Klaren sind, dass eine Prozedurtypvariable nur ein Zeiger ist, wissen Sie, was vor sich geht]. wie:
Typ
mypointer=procedure(form:Tform);Far;external;
var
Hinst:Thandle;
showform:mypointer;
beginnen
Hinst:=loadlibrary('yproject_dll');//Laden Sie eine DLL und suchen Sie sie anhand des Dateinamens.
showform:=getprocaddress(Hinst,'showform');//Nach Funktionsnamen suchen, Groß-/Kleinschreibung beachten. Dies ist klar, wenn Sie die Natur von Automatisierungsobjekten kennen.
showform(application.mainform);//Wird aufgerufen, wenn der Funktionseintragszeiger gefunden wird.
Freie Bibliothek (Hinst);
Ende;
7. Erstellen Sie ein TForM in der DLL
1 Verwendet Ihr Formular in DLL, und die zugehörigen Einheiten, die von Ihrem Formular verwendet werden, müssen ebenfalls verwendet werden in [Dies ist der problematischste Punkt, da Ihr Formular möglicherweise viele spezielle Einheiten oder Funktionen verwendet]
2 Übergeben Sie einen Anwendungsparameter und verwenden Sie ihn zum Erstellen des Formulars.
8. Erstellen Sie ein TMDIChildForM in der DLL
1 MDIForm.FormStyle in Dll muss nicht fmMDIChild sein.
2 Schreiben Sie nach CreateForm die folgenden zwei Sätze:
Funktion ShowForm(mainForm:TForm):integer;stdcall
var
Form1: TForm1;
ptr:PLongInt;
beginnen
ptr:=@(Application.MainForm);// Speichern Sie zuerst das MainForm-Handle der DLL. Es ist nicht erforderlich, es freizugeben, sondern nur zu ersetzen
ptr^:=LongInt(mainForm);//Ersetzen Sie die MainForm der DLL durch die mainForm des aufrufenden Programms. MainForm ist ein spezielles FENSTER, das speziell Formularressourcen in der Anwendung verwaltet.
//Warum nicht direkt Application.MainForm := mainForm, denn Application.MainForm ist eine schreibgeschützte Eigenschaft
Form1:=TForm1.Create(mainForm);//Mit Parametern erstellen
Ende;
Hinweis: Der Parameter ist Application.MainForm des aufrufenden Programms
Neun Beispiele:
DLL-Quellcode:
Bibliothek Projekt2;
verwendet
SysUtils,
Klassen,
Dialoge,
Formulare,
Unit2 in 'Unit2.pas' {Form2};
{$R *.RES}
var
ccc:Pchar;
procedure OpenForm(mainForm:TForm);stdcall;
var
Form1: TForm1;
ptr:PLongInt;
beginnen
ptr:=@(Application.MainForm);
ptr^:=LongInt(mainForm);
Form1:=TForm1.Create(mainForm);
Ende;
procedure InputCCC(Text: Pchar);stdcall;
beginnen
ccc := Text;
Ende;
Prozedur ShowCCC;stdcall;
beginnen
ShowMessage(String(ccc));
Ende;
Exporte
OpenForm;
EingabeCCC,
CCC anzeigen;
beginnen
Ende.
Quellcode des Aufrufers:
Einheit Einheit1;
Schnittstelle
verwendet
Windows, Nachrichten, SysUtils, Klassen, Grafiken, Steuerelemente, Formulare, Dialoge,
StdCtrls;
Typ
TForm1 = Klasse(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
Privat
{Private Erklärungen}
öffentlich
{Öffentliche Erklärungen}
Ende;
var
Form1: TForm1;
Durchführung
{$R *.DFM}
procedure OpenForm(mainForm:TForm);stdcall;External'project2.dll';
procedure ShowCCC;stdcall;External'project2.dll';
procedure InputCCC(Text: Pchar);stdcall;External'project2.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
Text: Pchar;
beginnen
Text := Pchar(Edit1.Text);
// OpenForm(Application.MainForm);//Um MDICHILD anzupassen
InputCCC(Text);//Um zu experimentieren, ob die globalen Variablen in der DLL von verschiedenen Anwendungen gemeinsam genutzt werden
Ende;
procedure TForm1.Button2Click(Sender: TObject);
beginnen
ShowCCC;//Dies zeigt, dass sich die globalen Variablen in der WINDOWS-32-Bit-Anwendungs-DLL auch im Anwendungsadressraum befinden. Die 16-Bit-Anwendung kann unterschiedlich sein und es wurden keine Experimente durchgeführt.
Ende;