Difference between revisions of "DLL dynamically load/de"
From Free Pascal wiki
Jump to navigationJump to search (Created page with "{{DLL dynamically load}} <br> <br> Dieser Artikel beschäftigt sich mit der Windowsprogrammierung.<br> Das Tutorial, zeigt wie eine DLL (Dynamic Link Library) <b>dynamisch</b>...") |
m (Fixed syntax highlighting; deleted category already in page template) |
||
(6 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
{{DLL dynamically load}} | {{DLL dynamically load}} | ||
− | + | ||
− | + | ||
− | Dieser Artikel beschäftigt sich mit der Windowsprogrammierung. | + | Zurück zu den [[Additional information/de|Zusätzlichen Informationen]]. |
− | Das Tutorial, zeigt wie eine DLL (Dynamic Link Library) <b>dynamisch</b> geladen wird. | + | |
− | + | ||
− | + | Dieser Artikel beschäftigt sich mit der Windowsprogrammierung. | |
− | Die Dll (DLLTest.dll) auf die sich im unteren Beispiel bezogen wird: | + | |
− | <syntaxhighlight> | + | Das Tutorial, zeigt wie eine DLL (Dynamic Link Library) <b>dynamisch</b> geladen wird. |
+ | |||
+ | Die Dll (DLLTest.dll) auf die sich im unteren Beispiel bezogen wird: | ||
+ | |||
+ | <syntaxhighlight lang=pascal> | ||
library Info; | library Info; | ||
Line 17: | Line 21: | ||
{$R *.res} | {$R *.res} | ||
− | // | + | // Das Unterprogramm der DLL |
function funStringZurueck(strUebergabe: string): PChar; | function funStringZurueck(strUebergabe: string): PChar; | ||
begin | begin | ||
Line 24: | Line 28: | ||
− | // | + | // Exportiertes Unterprgramm(e) |
exports | exports | ||
funStringZurueck; | funStringZurueck; | ||
Line 31: | Line 35: | ||
end. | end. | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | ||
− | + | Was ist zu tun: | |
− | Einbinden, verwenden und freigeben | + | |
− | <syntaxhighlight> | + | * Speicher definieren |
+ | ** Es ist ein Datentyp zu erstellen, der genau dem (externen) Unterprogramm entspricht, das aus der DLL importiert werden soll. | ||
+ | * Speicher reservieren | ||
+ | ** Es ist Speicher für eine Variable (Datenfeld) zu reservieren, der der obige Datentyp zu gewiesen wird. | ||
+ | ** Es ist Speicher für ein Handle zu reservieren, dem später der Handle der DLL zugewiesen wird. | ||
+ | * DLL und externes Unterprogramm zuweisen und die Daten entgegennehmen | ||
+ | ** Die DLL ist aufzurufen und dem Handle ist das Handle der DLL zuzuweisen. | ||
+ | ** Der Zeiger (Pointer) der Variablen muss auf den Speicher des externen Unterprogramms geändert werden. | ||
+ | ** Das Ergebnis des externen Unterprogramms ist entgegen zu nehmen. | ||
+ | * Alle Speicher freigeben | ||
+ | ** Der Zeiger (Pointer) der Variablen muss wieder auf einen ungültigen Speicherbereich zeigen (:= nil) um das externe Unterprogramm frei zugeben. | ||
+ | ** Der Speicher der DLL ist wieder freizugeben. | ||
+ | |||
+ | |||
+ | Einbinden, verwenden und freigeben des DLL-Unterprogramms im eigenen Programm: | ||
+ | |||
+ | <syntaxhighlight lang=pascal> | ||
uses | uses | ||
Windows, ...; | Windows, ...; | ||
Line 42: | Line 62: | ||
function funDllEinbinden: string; | function funDllEinbinden: string; | ||
type | type | ||
− | //Definition | + | //Definition des aufzurufenden Unterprogramms, wie es in der einzubindenden DLL definiert ist |
TfunStringZurueck = function(strUebergabe: string): PChar; stdcall; | TfunStringZurueck = function(strUebergabe: string): PChar; stdcall; | ||
var | var | ||
− | // Legt | + | // Legt eine passende Variable (Datenfeld) für das DLL-Unterprogramm an |
funStringZurueck: TfunStringZurueck; | funStringZurueck: TfunStringZurueck; | ||
− | // Legt einen Handle für | + | // Legt einen Handle für den Handle der DLL an |
LibHandle: THandle; | LibHandle: THandle; | ||
Line 59: | Line 79: | ||
if LibHandle <> 0 then | if LibHandle <> 0 then | ||
begin | begin | ||
− | // Weisst der Variablen funStringZurueck die Adresse des | + | // Weisst der Variablen funStringZurueck die Adresse des Unterprogrammaufrufs zu |
// 'funStringZurueck' aus der DLL DLLTest.dll zu. | // 'funStringZurueck' aus der DLL DLLTest.dll zu. | ||
Pointer(funStringZurueck) := GetProcAddress(LibHandle, 'funStringZurueck'); | Pointer(funStringZurueck) := GetProcAddress(LibHandle, 'funStringZurueck'); | ||
Line 68: | Line 88: | ||
end; | end; | ||
− | // Freigabe des | + | // Freigabe des Arbeitsspeichers |
funStringZurueck := nil; | funStringZurueck := nil; | ||
FreeLibrary(LibHandle); | FreeLibrary(LibHandle); | ||
Line 77: | Line 97: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
− | |||
− | |||
− |
Latest revision as of 09:03, 13 February 2020
Dieser Artikel behandelt ausschließlich Windows.
Siehe auch: Multiplatform Programming Guide/de
│
Deutsch (de) │
English (en) │
русский (ru) │
中文(中国大陆) (zh_CN) │
Zurück zu den Zusätzlichen Informationen.
Dieser Artikel beschäftigt sich mit der Windowsprogrammierung.
Das Tutorial, zeigt wie eine DLL (Dynamic Link Library) dynamisch geladen wird.
Die Dll (DLLTest.dll) auf die sich im unteren Beispiel bezogen wird:
library Info;
{$mode objfpc}{$H+}
uses
SysUtils;
{$R *.res}
// Das Unterprogramm der DLL
function funStringZurueck(strUebergabe: string): PChar;
begin
funStringZurueck := PChar(UpperCase(strUebergabe));
end;
// Exportiertes Unterprgramm(e)
exports
funStringZurueck;
begin
end.
Was ist zu tun:
- Speicher definieren
- Es ist ein Datentyp zu erstellen, der genau dem (externen) Unterprogramm entspricht, das aus der DLL importiert werden soll.
- Speicher reservieren
- Es ist Speicher für eine Variable (Datenfeld) zu reservieren, der der obige Datentyp zu gewiesen wird.
- Es ist Speicher für ein Handle zu reservieren, dem später der Handle der DLL zugewiesen wird.
- DLL und externes Unterprogramm zuweisen und die Daten entgegennehmen
- Die DLL ist aufzurufen und dem Handle ist das Handle der DLL zuzuweisen.
- Der Zeiger (Pointer) der Variablen muss auf den Speicher des externen Unterprogramms geändert werden.
- Das Ergebnis des externen Unterprogramms ist entgegen zu nehmen.
- Alle Speicher freigeben
- Der Zeiger (Pointer) der Variablen muss wieder auf einen ungültigen Speicherbereich zeigen (:= nil) um das externe Unterprogramm frei zugeben.
- Der Speicher der DLL ist wieder freizugeben.
Einbinden, verwenden und freigeben des DLL-Unterprogramms im eigenen Programm:
uses
Windows, ...;
...
function funDllEinbinden: string;
type
//Definition des aufzurufenden Unterprogramms, wie es in der einzubindenden DLL definiert ist
TfunStringZurueck = function(strUebergabe: string): PChar; stdcall;
var
// Legt eine passende Variable (Datenfeld) für das DLL-Unterprogramm an
funStringZurueck: TfunStringZurueck;
// Legt einen Handle für den Handle der DLL an
LibHandle: THandle;
begin
// Ermittelt den Handle der zuverwendenden Library
LibHandle := LoadLibrary(PChar('DLLTest.dll'));
// Prüft, ob das Laden der DLL erfolgreich war
if LibHandle <> 0 then
begin
// Weisst der Variablen funStringZurueck die Adresse des Unterprogrammaufrufs zu
// 'funStringZurueck' aus der DLL DLLTest.dll zu.
Pointer(funStringZurueck) := GetProcAddress(LibHandle, 'funStringZurueck');
// Prüft, ob eine gültige Adresse zurück gegeben wurde
if @funStringZurueck <> nil then
Result := funStringZurueck('hallo welt');
end;
// Freigabe des Arbeitsspeichers
funStringZurueck := nil;
FreeLibrary(LibHandle);
end;
...