![]() |
Problem mit statischer dll in Lazarus
Hallo,
ich habe einen kleinen Testcode in Delphi7 geschrieben, der eine dll statisch lädt und deren Funktionen nutzt. Der Code funktioniert in Delphi einwandfrei. Wenn ich den Code nach Lazarus konvertiere, compiliert der zwar fehlerfrei, aber nach dem Start wird er sofort wieder ohne Fehlermeldung beendet. Die DLL befindet sich jeweils im selben Verzeichnis wie die exe und ist ebenfalls mit Delphi geschrieben. Was könnte da schief gehen? Hier der konvertierte Lazarus-Code:
Delphi-Quellcode:
Hier noch die lpr:
unit Unit1;
{$MODE Delphi} interface uses Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Label1: TLabel; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; procedure DllMessage; external 'TestLib.dll'; function DLL_Calc(i: integer): integer; external 'TestLib.dll'; procedure DLL_ShowForm; external 'TestLib.dll'; implementation {$R *.lfm} procedure TForm1.Button1Click(Sender: TObject); begin DllMessage; end; procedure TForm1.Button2Click(Sender: TObject); begin Label1.Caption:=inttostr(DLL_Calc(2)); end; procedure TForm1.Button3Click(Sender: TObject); begin DLL_ShowForm; end; end.
Delphi-Quellcode:
Bei einem anderen Programm mit einer fremden dll habe ich in Lazarus ein ähnliches Problem, allerdings da mit Fehlermeldung "dll nicht gefunden", wohingegen der entsprechende Delphi-Code funktioniert.
program Project1;
{$MODE Delphi} uses Forms, Interfaces, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. Danke für Eure Hilfe! |
AW: Problem mit statischer dll in Lazarus
Hallo,
kompilierst du in Lazarus mit dem 64Bit Compiler? Hast du die TestLib.dll auch neu in Lazarus kompiliert, oder benutzt du die Datei, die du schon in D7 verwendet hast?
Delphi-Quellcode:
Das Hauptprogramm:
// Das Beispiel stammt von hier: https://www.delphi-treff.de/tutorials/objectpascal/dlls/4/
// Delphi 10.4.1 library TestDLL; uses System.SysUtils, System.Classes; {$R *.res} function addiere(zahl1, zahl2: integer): integer; stdcall; begin result := zahl1+zahl2; end; exports addiere; begin end. // Lazarus library TestDLL; {$mode objfpc}{$H+} uses Classes; function addiere(zahl1, zahl2: integer): integer; stdcall; begin result := zahl1+zahl2; end; exports addiere; begin end.
Delphi-Quellcode:
Ich habe hier testweise mit Delphi 10.4.1 eine Test-DLL erstellt (32Bit und 64Bit) und diese in ein Lazarus-Programm (64Bit Compiler)
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private public end; function addiere(zahl1, zahl2: integer): integer; stdcall; external 'TestDLL.dll'; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin i:=addiere(2,3); Memo1.Lines.Add(IntToStr(i)); end; end. eingebunden. Erwartungsgemäß gab es beim Programmstart mit der 32Bit-DLL eine Fehlermeldung und der Vorgang wurde abgebrochen. Mit der 64Bit-DLL funktionierte es einwandfrei. Ebenso mit einer in Lazarus kompilierten DLL. Ich vermute mal, dass du 64Bit und 32Bit durcheinander bringst. |
AW: Problem mit statischer dll in Lazarus
Eventuell wuden auch die falschen Aufrufkonventionen verwendet? (stdcall/cdecl/...)
Allerdings dürfte das auch erst beim Ausführen der Funktionen knallen (Button-Clicks). :gruebel: Bei 64 Bit ist es egal, da dort diese Angabe von allen Compilern ignoriert wird. (es gibt nur noch eine Konvention ... die zufällig fast so aussieht wie von Delphi ... haben bei uns abgeguckt) Die LPR ist nutzlos, da sie keine relevanten Infos enthält. Vergessen wurde aber der Quellcode der DLL. Zitat:
|
AW: Problem mit statischer dll in Lazarus
Hallo,
was genau meinst du damit: Zitat:
|
AW: Problem mit statischer dll in Lazarus
Hallo,
es fehlt mindestens das Gegenstück der Methoden in der DLL, also wie sie dort definiert sind. Ich würde auch testweise mal dynamisch laden (LoadLibrary/GetProcAddress), nur um sicherzugehen, dass es dort OK ist. |
AW: Problem mit statischer dll in Lazarus
In dem gezeigten Quellcode der LPR steht nichts drin, was irgenwie mit der DLL zu tun hat.
Aber da es aber vor allem um die DLL zu gehen scheint, wäre nicht nur der aufrufende Teil interessant, sondern auch der Teil, welcher aufgerufen wird. :zwinker: Wenn es im Debugger nicht knallt und man direkt zu der fehlerhaften Codestelle kommt, dann kann man immernoch selbst schrittweise (F7/F8) durchgehen und schauen welche Codezeilen abgearbetet werden. Falls es nicht schon vor dem Programmcode knallt, weil z.B. schon Windows nicht die nötigen DLL-Funktionen in der DLL oder die DLL selbst Finden kann, oder es beim Laden der DLL abraucht, weil dort drin der Fehler liegt. |
AW: Problem mit statischer dll in Lazarus
Problem gelöst, hatte nichts mit der dll zu tun.
Ich weiß nicht warum, aber der Delphi nach Lazarus-Konverter hat die Pfade verbogen. Die Exe wurde nach .\lib\x86_64-win64 compiliert. Der Debugger hats dann wohl nicht gefunden und einfach gar nichts gemacht, daher kein Single-Step und keine Fehlermeldung. Grrr. 32bit bzw. 64 bit dlls ist ein guter Punkt. Ich glaube, ich weiß jetzt auch, warum auf meinem x64 Windows meine Delphi-Programme nur 32bit dlls laden können. Delphi7 kann nur 32bit Code erzeugen. |
AW: Problem mit statischer dll in Lazarus
Hallo ich bitte euch schnell um Hilfe
ich schreibe gerade mein Programm bei Lazarus und es kommt die ganze zeit das selbe Fehler procedure TForm1.Button1Click(Sender: TObject); var anzahl:integer; einzelpreis, summe, nettopreis, gegeben, rueckgeld, mwst: real; begin //Eingabe anzahl:=strtoint(Edit2.Text); einzelpreis:=strtofloat(Edit3.Text); gegeben:=strtofloat(Edit4.Text); //Verarbeitung summe:=anzahl*einzelpreis; nettopreis:=summe/1.19; rueckgeld:=gegeben-summe; mwst:=summe-nettopreis //Ausgabe AL1.Caption:=floattostr(summe); AL2.Caption:=formatfloat('0.00',nettopreis); ALrg.Caption:=floattostr(Rueckgeld); end; end. der Fehler lautet: unit1.pas(66,4) Fatal:Syntex error; ";"expected but "identifierAL1" found |
AW: Problem mit statischer dll in Lazarus
Hinter mwst:=summe-nettopreis fehlt dir das Befehlszeilen abschließende Semikolon.
Delphi-Quellcode:
mwst:=summe-nettopreis;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 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