![]() |
DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinden?
Hallo allerseits!
Seit geraumer Zeit suche ich mir einen Wolf im www, leider vergeblich. Kurzum: Ist es möglich, in Lazarus / Freepascal DLL-Funktionen einzubinden, und, falls ja, wie? Besten Dank im voraus! Gruß Delphi-Laie |
Re: DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinde
Mit Sicherheit. Unter Windows mit den üblichen Windows-API Funktionen:
![]() ![]() ![]() |
Re: DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinde
Zitat:
Es gibt allerdings, wie ich gerade herausfand, in Lazarus eine Unit "Windows" (einfach probehalber manuell mit eingebunden, wird erkannt bzw. akzeptiert). Damit scheint mein Ansinnen schon deutlich günstiger auszusehen. :-D |
Re: DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinde
Wäre ja irgendwie etwas selten dämlich, wenn man mit FreePascal Windows Programme erstellen könnte, es aber keine Möglichkeit gäbe Windows Funktionen zu nutzen.
|
Re: DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinde
Zitat:
Edit: Mein anfänglicher Optimismus ist leider schon wieder stark gedämpft: Lazarus kennt auch mit eingebundener Unit "windows" den Befehl "GetProcAddress" nicht. Dieser ist m.E. aber nötig, um DLL-Funktionen in den DLLs zu lokalisieren. |
Re: DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinde
Zitat:
![]() |
Re: DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinde
Um dir noch etwas mehr auf die Sprünge zu helfen:
(Un)LoadLibrary und GetProcAddress sind plattformunabhängig in der Unit DynLibs definiert. Mit SharedSuffix hast du übrigens dann auch noch eine Konstante für die Dateierweiterung ('.dll' unter Windows und '.so' unter Linux). Die Unit Windows kannst du wieder aus deiner Uses entfernen, außer du möchtest explizit nur für Windows programmieren. Zitat:
Gruß, Sven |
Re: DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinde
Besten Dank, also man muß mindestens die Units windows und dynlibs einbinden, um DLL-Funktionen aufrufen bzw. benutzen zu können.
Zitat:
![]()
Delphi-Quellcode:
Dank der beiden nunmehr bekannten und eingebundenen Units bekomme ich ein analoges Beispiel auch endlich (fehlerfrei) compiliert. So, jetzt hat man ein PHandle auf die gewünschte Funktion. Wie man damit jetzt seine Wunschfunktion aufrufen kann, ist mir allerdings leider immer noch unklar. Ich bitte um Nachsicht, daß ich mal wieder ein Anfänger bin. Ich versuche, mit dieser Funktion "GetProcAdress" eine Lösung dafür im Internet zu finden.
procedure TForm1.KOLForm1FormCreate(Sender: PObj);
var DLLHandle: THandle; u:Integer; returnhandle: PHandle; begin DLLHandle := Windows.LoadLibrary(SimpleLibName); if (DLLHandle < HINSTANCE_ERROR) then begin Label1.Caption:='DLL konnte nicht geladen werden!'; end; returnhandle := GetProcAddress(DLLHandle, 'HTCSensorOpen'); end; Zitat:
|
Re: DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinde
Zitat:
Einfach nur Pointer. Oder besser noch ein Zeiger auf eine Funktion, bzw. (zumindestens in Delphi) ein Funktions-Typ. (Delphi weiß ja intern, das man damit einen Zeiger meint) viele Beispiele siehe ![]()
Delphi-Quellcode:
var func: function(params): result;
//type tfunc = function(params): result; //var func: tfunc; func := GetProcAddress... |
Re: DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinde
Vielen, herzlichen Dank für Eure Mühen, aber nach Stunden erfolgslosen Probierens stehe ich nunmehr total auf dem Schlauch, wie ich es Delphi schon seit Jahren nicht mehr erlebte.
Anscheinend geht es in etwa darum, die Delphi-Kapselung vieler API-Funktionen in Lazarus nachzubilden. Ich versuche beispielhaft, die CreateToolhelp32Snapshot-Funktion zunächst erst einmal erfolreich aufzurufen, scheitere daran aber natürlich (konkret schon in der Zeile davor, in der ich die Beispielfunktion wertzuweisen beabsichtige):
Delphi-Quellcode:
An die Kryptigkeit der Fehlermeldungen habe ich mich auch längst gewöhnt, aber vor
procedure TForm1.FormCreate(Sender: TObject);
var DLLHandle,hProcessSnap: THandle; Beispielfunktion: function(dwFlags:Integer;th32ProcessID:Integer):THandle;//alternativ Funktionsergebnistyp:Pointer, mit dem klappt es aber auch nicht begin DLLHandle := LoadLibrary(kernel32); if (DLLHandle < HINSTANCE_ERROR) then showmessage('DLL konnte nicht geladen werden!') else begin Beispielfunktion := @GetProcAddress(DLLHandle, 'CreateToolhelp32Snapshot');//klappt auch nicht, wenn ich das „@“ weglasse //hProcessSnap:=CreateToolHelp32SnapShot(2{TH32CS_SNAPPROCESS},0); FreeLibrary(kernel32) end end;
Delphi-Quellcode:
kapituliere ich. Um nur mal die zweite Fehlermeldung zu kommentieren: Warum darf ich GetProcAddress auf einmal nicht mehr mit Parametern aufrufen?
unit1.pas(38,25) Error: Incompatible types: got "<address of function(LongInt, AnsiString):^untyped;Register>" expected "<procedure variable type of function(LongInt, LongInt):DWord;Register>"
unit1.pas(38,40) Fatal: Syntax error, ";" expected but "(" found Ich begreife zudem nicht, was dieses ganze Rumgemache mit Loadlibrary und GetProcAddress überhaupt soll. Bisher lernte ich in Delphi die Aufrufe externer DLL-Funktionen so kennen (hat bisher, bei mir jedenfalls, immer so geklappt), Beispiel:
Delphi-Quellcode:
interface
function OpenThread(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; stdcall; implementation function OpenThread; external kernel32 name 'OpenThread'; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz