Difference between revisions of "DLL dynamically load/de"
From Free Pascal wiki
Jump to navigationJump to searchm |
|||
Line 24: | Line 24: | ||
− | // | + | // Exportiertes Unterprgramm(e) |
exports | exports | ||
funStringZurueck; | 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;
// 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 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)