AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Problem mit statischer dll in Lazarus
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit statischer dll in Lazarus

Ein Thema von iphi · begonnen am 5. Nov 2020 · letzter Beitrag vom 29. Nov 2020
Antwort Antwort
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#1

Problem mit statischer dll in Lazarus

  Alt 5. Nov 2020, 14:25
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:
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.
Hier noch die lpr:
Delphi-Quellcode:
program Project1;

{$MODE Delphi}

uses
  Forms, Interfaces,
  Unit1 in 'Unit1.pas{Form1};

{$R *.res}

begin

  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
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.

Danke für Eure Hilfe!
  Mit Zitat antworten Zitat
ghubi01

Registriert seit: 18. Nov 2017
133 Beiträge
 
Delphi 12 Athens
 
#2

AW: Problem mit statischer dll in Lazarus

  Alt 5. Nov 2020, 19:17
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 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.
Das Hauptprogramm:
Delphi-Quellcode:
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.
Ich habe hier testweise mit Delphi 10.4.1 eine Test-DLL erstellt (32Bit und 64Bit) und diese in ein Lazarus-Programm (64Bit Compiler)
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Problem mit statischer dll in Lazarus

  Alt 5. Nov 2020, 20:04
Eventuell wuden auch die falschen Aufrufkonventionen verwendet? (stdcall/cdecl/...)
Allerdings dürfte das auch erst beim Ausführen der Funktionen knallen (Button-Clicks).

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:
aber nach dem Start wird er sofort wieder ohne Fehlermeldung beendet
Auch der Debugger sagt nichts?
$2B or not $2B

Geändert von himitsu ( 5. Nov 2020 um 20:11 Uhr)
  Mit Zitat antworten Zitat
ghubi01

Registriert seit: 18. Nov 2017
133 Beiträge
 
Delphi 12 Athens
 
#4

AW: Problem mit statischer dll in Lazarus

  Alt 5. Nov 2020, 20:49
Hallo,
was genau meinst du damit:
Die LPR ist nutzlos, da sie keine relevanten Infos enthält.
Vergessen wurde aber der Quellcode der DLL.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Problem mit statischer dll in Lazarus

  Alt 5. Nov 2020, 20:53
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.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Problem mit statischer dll in Lazarus

  Alt 5. Nov 2020, 21:28
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.

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.
$2B or not $2B

Geändert von himitsu ( 5. Nov 2020 um 21:31 Uhr)
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#7

AW: Problem mit statischer dll in Lazarus

  Alt 6. Nov 2020, 14:23
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.
  Mit Zitat antworten Zitat
osama.jla

Registriert seit: 29. Nov 2020
1 Beiträge
 
#8

AW: Problem mit statischer dll in Lazarus

  Alt 29. Nov 2020, 01:54
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
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Problem mit statischer dll in Lazarus

  Alt 29. Nov 2020, 10:35
Hinter mwst:=summe-nettopreis fehlt dir das Befehlszeilen abschließende Semikolon.

mwst:=summe-nettopreis;
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 12:06 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