AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen FreePascal DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinden?
Thema durchsuchen
Ansicht
Themen-Optionen

DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinden?

Ein Thema von Delphi-Laie · begonnen am 11. Mär 2010 · letzter Beitrag vom 1. Dez 2013
Antwort Antwort
Seite 1 von 6  1 23     Letzte »    
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

DLL-Funktionen in Lazarus/FP einbindbar / wie einzubinden?

  Alt 11. Mär 2010, 20:29
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 11. Mär 2010, 20:32
Mit Sicherheit. Unter Windows mit den üblichen Windows-API Funktionen: MSDN-Library durchsuchenLoadLibrary, MSDN-Library durchsuchenGetProcAddress, MSDN-Library durchsuchenFreeLibrary.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#3

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

  Alt 11. Mär 2010, 20:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

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

  Alt 11. Mär 2010, 20:50
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#5

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

  Alt 11. Mär 2010, 21:06
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.
  Mit Zitat antworten Zitat
creed steiger

Registriert seit: 2. Dez 2009
116 Beiträge
 
#6

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

  Alt 11. Mär 2010, 23:28
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
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#7

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

  Alt 12. Mär 2010, 10:24
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 von Delphi-Laie:
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?

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

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

  Alt 12. Mär 2010, 11:31
Besten Dank, also man muß mindestens die Units windows und dynlibs einbinden, um DLL-Funktionen aufrufen bzw. benutzen zu können.

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 von JamesTKirk:
Zitat von Delphi-Laie:
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?
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.079 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 12. Mär 2010, 11:44
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...
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#10

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

  Alt 12. Mär 2010, 14:20
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';
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 6  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:46 Uhr.
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