DLL dynamically load/de
From Lazarus wiki
Jump to navigationJump to search
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;
...