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>...") |
|||
Line 33: | Line 33: | ||
<br> | <br> | ||
<br> | <br> | ||
+ | |||
+ | 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 der DLL-Funktion im eigenen Programm:<br> | Einbinden, verwenden und freigeben der DLL-Funktion im eigenen Programm:<br> | ||
<syntaxhighlight> | <syntaxhighlight> | ||
Line 42: | Line 58: | ||
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 die Speicheradresse der DLL-Funktion an | // Legt einen Handle für die Speicheradresse der DLL-Funktion an | ||
Line 59: | Line 75: | ||
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'); |
Revision as of 18:14, 4 June 2013
Dieser Artikel behandelt ausschließlich Windows.
Siehe auch: Multiplatform Programming Guide/de
│
Deutsch (de) │
English (en) │
русский (ru) │
中文(中国大陆) (zh_CN) │
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}
// Die Funktion der DLL
function funStringZurueck(strUebergabe: string): PChar;
begin
funStringZurueck := PChar(UpperCase(strUebergabe));
end;
// Exportierte Funktion(en)
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 der DLL-Funktion 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 die Speicheradresse der DLL-Funktion 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 Arbeistspeichers
funStringZurueck := nil;
FreeLibrary(LibHandle);
end;
...
--Olaf 13:48, 4 June 2013 (UTC)