Delphi-PRAXiS
Seite 1 von 6  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinden? (https://www.delphipraxis.net/148977-dll-funktionen-lazarus-fp-einbindbar-wie-einzubinden.html)

Delphi-Laie 11. Mär 2010 19:29


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

Luckie 11. Mär 2010 19:32

Re: DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinde
 
Mit Sicherheit. Unter Windows mit den üblichen Windows-API Funktionen: MSDN-Library durchsuchenLoadLibrary, MSDN-Library durchsuchenGetProcAddress, MSDN-Library durchsuchenFreeLibrary.

Delphi-Laie 11. Mär 2010 19:42

Re: DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinde
 
Zitat:

Zitat von Luckie
Mit Sicherheit. Unter Windows mit den üblichen Windows-API Funktionen: MSDN-Library durchsuchenLoadLibrary, MSDN-Library durchsuchenGetProcAddress, MSDN-Library durchsuchenFreeLibrary.

Tausend Dank! Bis zum Loadlibrary kämpfte ich mich auch schon vor, das allerdings in Delphi von der Unit "windows" bereitgestellt wird. Erwartungsgemäß kennt Lazarus es nicht (jedenfalls nicht in der standardinstallierten Form).

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

Luckie 11. Mär 2010 19:50

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.

Delphi-Laie 11. Mär 2010 20:06

Re: DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinde
 
Zitat:

Zitat von Luckie
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.

Naja, immerhin sind FreePascal/Lazarus plattformübergreifend, und so hätte es ja sein können, daß man nur Windowsprogramme erstellen kann, die Visual Controls enthalten, die auch in anderen Betriebsprogrammen bekannt sind, aber eben nicht windowsspezifische Dinge / Interna.

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.

creed steiger 11. Mär 2010 22:28

Re: DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinde
 
Zitat:

Zitat von Delphi-Laie

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.

ist es das was du suchst?(erster Treffer)
http://www.google.de/search?hl=en&so...=Google+Search

JamesTKirk 12. Mär 2010 09:24

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:

Zitat von Delphi-Laie
Zitat:

Zitat von Luckie
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.

Naja, immerhin sind FreePascal/Lazarus plattformübergreifend, und so hätte es ja sein können, daß man nur Windowsprogramme erstellen kann, die Visual Controls enthalten, die auch in anderen Betriebsprogrammen bekannt sind, aber eben nicht windowsspezifische Dinge / Interna.

Wie meinst du das jetzt? :gruebel:

Gruß,
Sven

Delphi-Laie 12. Mär 2010 10:31

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:

Zitat von creed steiger
ist es das was du suchst?(erster Treffer)
http://www.google.de/search?hl=en&so...=Google+Search

Ja, danke, aber meine Suche mit Lazarus + DLL (die Namen der nötigen Funktionen sind am Anfang ja unbekannt) führte mich zunächst hierher, und zwar zu dem Code:

Delphi-Quellcode:
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;
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.

Zitat:

Zitat von JamesTKirk
Zitat:

Zitat von Delphi-Laie
Zitat:

Zitat von Luckie
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.

Naja, immerhin sind FreePascal/Lazarus plattformübergreifend, und so hätte es ja sein können, daß man nur Windowsprogramme erstellen kann, die Visual Controls enthalten, die auch in anderen Betriebsprogrammen bekannt sind, aber eben nicht windowsspezifische Dinge / Interna.

Wie meinst du das jetzt? :gruebel:

Na, ich meinte, daß es doch auch hätte sein können, daß man mit Lazarus nur solche Dinge programmieren kann, die auch plattformunabhängig oder besser plattformübergreifend vorhanden sind. Also z.B. keine Registryzugriffe. Daß es betriebsprogrammspezifische Dinge gibt, ist mir seit gestern neu, und ich sehe das natürlich positiv.

himitsu 12. Mär 2010 10:44

Re: DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinde
 
Zitat:

Zitat von Delphi-Laie
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.

PHandle?
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 Hier im Forum suchenGetProcAddress


Delphi-Quellcode:
var func: function(params): result;
//type tfunc = function(params): result;
//var func: tfunc;

func := GetProcAddress...

Delphi-Laie 12. Mär 2010 13:20

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:
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;
An die Kryptigkeit der Fehlermeldungen habe ich mich auch längst gewöhnt, aber vor

Delphi-Quellcode:
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
kapituliere ich. Um nur mal die zweite Fehlermeldung zu kommentieren: Warum darf ich GetProcAddress auf einmal nicht mehr mit Parametern aufrufen?

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 20:49 Uhr.
Seite 1 von 6  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz