Sign in Join
Wiki copytemporary

DLL dynamically load/de: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Zurück zu den [[Additional information/de|Zusätzlichen Informationen]].
22
33Dieser Artikel beschäftigt sich mit der Windowsprogrammierung.
44
5-Das Tutorial, zeigt wie eine DLL (Dynamic Link Library) <b>dynamisch</b> geladen wird.
5+Das Tutorial, zeigt wie eine DLL (Dynamic Link Library) dynamisch geladen wird.
66
77Die Dll (DLLTest.dll) auf die sich im unteren Beispiel bezogen wird:
88
99``` pascal
1010library Info;
1111
1212{$mode objfpc}{$H+}
1313
1414uses
1515 SysUtils;
1616
1717{$R *.res}
1818
1919// Das Unterprogramm der DLL
2020 function funStringZurueck(strUebergabe: string): PChar;
2121 begin
2222 funStringZurueck := PChar(UpperCase(strUebergabe));
2323 end;
2424
2525// Exportiertes Unterprgramm(e)
2626exports
2727 funStringZurueck;
2828
2929begin
3030end.
3131```
3232
3333Was ist zu tun:
3434
3535- Speicher definieren
3636 - Es ist ein Datentyp zu erstellen, der genau dem (externen) Unterprogramm entspricht, das aus der DLL importiert werden soll.
3737- Speicher reservieren
3838 - Es ist Speicher für eine Variable (Datenfeld) zu reservieren, der der obige Datentyp zu gewiesen wird.
3939 - Es ist Speicher für ein Handle zu reservieren, dem später der Handle der DLL zugewiesen wird.
4040- DLL und externes Unterprogramm zuweisen und die Daten entgegennehmen
4141 - Die DLL ist aufzurufen und dem Handle ist das Handle der DLL zuzuweisen.
4242 - Der Zeiger (Pointer) der Variablen muss auf den Speicher des externen Unterprogramms geändert werden.
4343 - Das Ergebnis des externen Unterprogramms ist entgegen zu nehmen.
4444- Alle Speicher freigeben
4545 - Der Zeiger (Pointer) der Variablen muss wieder auf einen ungültigen Speicherbereich zeigen (:= nil) um das externe Unterprogramm frei zugeben.
4646 - Der Speicher der DLL ist wieder freizugeben.
4747
4848Einbinden, verwenden und freigeben des DLL-Unterprogramms im eigenen Programm:
4949
5050``` pascal
5151uses
5252 Windows, ...;
5353
5454 ...
5555
5656function funDllEinbinden: string;
5757type
5858 //Definition des aufzurufenden Unterprogramms, wie es in der einzubindenden DLL definiert ist
5959 TfunStringZurueck = function(strUebergabe: string): PChar; stdcall;
6060
6161var
6262 // Legt eine passende Variable (Datenfeld) für das DLL-Unterprogramm an
6363 funStringZurueck: TfunStringZurueck;
6464 // Legt einen Handle für den Handle der DLL an
6565 LibHandle: THandle;
6666
6767begin
6868
6969 // Ermittelt den Handle der zuverwendenden Library
7070 LibHandle := LoadLibrary(PChar('DLLTest.dll'));
7171
7272 // Prüft, ob das Laden der DLL erfolgreich war
7373 if LibHandle <> 0 then
7474 begin
7575 // Weisst der Variablen funStringZurueck die Adresse des Unterprogrammaufrufs zu
7676 // 'funStringZurueck' aus der DLL DLLTest.dll zu.
7777 Pointer(funStringZurueck) := GetProcAddress(LibHandle, 'funStringZurueck');
7878
7979 // Prüft, ob eine gültige Adresse zurück gegeben wurde
8080 if @funStringZurueck <> nil then
8181 Result := funStringZurueck('hallo welt');
8282 end;
8383
8484 // Freigabe des Arbeitsspeichers
8585 funStringZurueck := nil;
8686 FreeLibrary(LibHandle);
8787
8888end;
8989
9090 ...
9191```
9292
9393---
9494*From the Free Pascal wiki, page "DLL dynamically load/de", as it stood on 2020-02-13 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history