Lazarus erstellt fehlerhafte DLLs (Win XP)

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Lazarus erstellt fehlerhafte DLLs (Win XP)

Beitrag von MitjaStachowiak »

Ich versuche jetzt schon seit Wochen, das Problem, was ich bereits hier (http://www.lazarusforum.de/viewtopic.php?f=18&t=3833" onclick="window.open(this.href);return false;) beschrieben habe, zu lösen.

Ich bekomme es einfach nicht hin eine DLL mit Lazarus fehlerfrei zu compilieren. Hier mal mein Quellcode:

DLL:

Code: Alles auswählen

library dll;
 
{$mode objfpc}{$H+}
 
uses
  Classes,Dialogs
  { you can add units after this };
 
{$IFDEF WINDOWS}{$R dll.rc}{$ENDIF}
 
function DLLFunction(var1 : cardinal) : cardinal;
begin
 Result := var1 + 10;
end;
 
exports DLLFunction;
 
end.
Programm:

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
 Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
 StdCtrls, Windows;
 
type
 TDLLFUNCTION = function(var1 : cardinal) : cardinal;
 
  { TForm1 }
 
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Load(Sender: TObject);
  private
   { private declarations }
  public
   { public declarations }
 end;
 
var
 Form1       : TForm1;
 dllHandle   : THandle;
 dllFunction : TDLLFUNCTION;
 
implementation
 
{ TForm1 }
 
procedure TForm1.Load(Sender: TObject);
begin
 dllHandle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + '\DLL\dll.dll'));
 showmessage('Geladen');
 dllFunction := TDLLFUNCTION(GetProcAddress(dllHandle,'DLLFunction'));
 ShowMessage(IntToStr(dllFunction(10)));
 FreeLibrary(dllHandle);
 showmessage('Frei');
end;
 
initialization
  {$I unit1.lrs}
 
end.
Beim Klicken gibt das Programm erst 'Geladen' und dann '20' aus. Dann bleibt es hängen und kann nur per Task-Manager beendet werden...

Bevor ich die zwei Zeilen zum Zugriff auf die DLL-Funktion drinnen hatte, hat FreeLibrary auch mal funktioniert. Aber jetzt weiß ich nicht mehr weiter. Es kommt auch kein Fehler, oder so.
Irgendwie muss man aber doch DLLs mit Lazarus erstellen können. Ich bin ja wohl kaum der erste, der das versucht...?
Also meine Frage: Was läuft da schief?

PS: Hab' mal einen ZIP-Ordner mit dem kompletten Programm und Quellcode angehängt.
Dateianhänge
DLL-FehlerInLazarus.zip
Programm & DLL mit Quellcode
(3.5 MiB) 95-mal heruntergeladen

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Lazarus erstellt fehlerhafte DLLs (Win XP)

Beitrag von theo »

Keine Ahnung. Was hast du denn schon ausprobiert?
Hast du's mal ohne die unit Dialogs in der DLL versucht? Damit handelst du dir unnötige Abhängigkeiten von der LCL ein.
Ich weiss aber nicht, ob's daran liegt.
Vielleicht braucht's auch eine explizite Aufrufkonvention auf beiden Seiten (stdcall), so wie hier:
http://de.wikibooks.org/wiki/Programmie ... rammierung" onclick="window.open(this.href);return false;
Ist zwar eher unwahrscheinlich aber probieren kann man's ja mal ;-)

Delphi-Laie
Beiträge: 26
Registriert: So 24. Jan 2010, 21:56

Re: Lazarus erstellt fehlerhafte DLLs (Win XP)

Beitrag von Delphi-Laie »

Hallo MitjaStachowiak!

Eine substantielle i.S.v. inhaltliche(r) Hilfe kann ich Ihnen erst einmal nicht geben, dafür jedoch einen kurzen Erfahrungsbericht.

Inzwischen portierte ich zwei Delphi-Projekte von Delphi zu/nach Lazarus, und zwar in beiden Fällen, weil ich 64-Bit-Funktionalität benötigte, weil beide 32-Bit-Compilate keine bzw. nur eingeschränkte Funktionalität unter 64-Bit-Windows bieten (globaler Hook funktioniert gar nicht, und die Windows-API-Funktion CreateToolHelpSnapShot nicht vollumfänglich). Leider bekamen die Embarcaderos die 64 Bit, obwohl es die schon seit mehrere Jahren (inkl. Betaversionen sogar seit vielen Jahren) gibt, im Gegensatz zum Freewareprojekt bis heute einfach nicht hin (welch ein Armutszeugnis!), und wie es ausschaut, wird das auch noch ein geraumes Weilchen so bleiben (nur, dann wird es zu spät sein, Lazarus gewinnt täglich neue Anhänger, während Embarcadero langsam, aber sicher die Basis wegbricht). Zurück zum Thema: Nun, die Comilierung des ursprünglich für (32-Bit-)Delphi-DLL-Quelltextes war bisher das unkomplizierteste, was ich bis dato erlebte, während alles, was mit VCL zu tun hat, m.E. eine ziemlich mühsame Fummelei ist. Wenn ich mich recht entsinne, fehlten Lazarus nur zwei Semikola, die Delphi nicht vermißte, das war schon alles. Das Compilat, also die DLL, funktioniert auch als 64-Bit-Version unter - logischerweise - 64-Bit-Windows.

Deshalb:

1. Kopf hoch!

2. Hatten Sie schon mal versucht, das vorher mit/in Delphi zu realisieren? Delphi ist nach meiner Beobachtung fehlertoleranter, es „schluckt“ einfach mehr als Lazarus. Wenn es unter Delphi nicht zu realisieren ist, dann sieht es m.E. mit Lazarus eher trüb aus. Doch als Indikator für die Realisierbarkeit würde ich dem Ganzen unter Delphie eine neue, nächste Chance verpassen.

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Lazarus erstellt fehlerhafte DLLs (Win XP)

Beitrag von MitjaStachowiak »

Oh, tatsächlich! Ohne das Dialogs scheint es zu gehen.
Ich war mir sicher, dass ich es schon mit - und ohne versucht habe. Aber das war dann wohl im anderen Programm, wo ich noch Probleme mit Sharemem hatte...

Mal sehen, ob ich jetzt weiter komme ;-)

Vielen Dank erstmal, für deinen Tipp!

Ich verwende übrigens ein 32 Bit-System. In Delphi hatte das alles schon funktioniert - auch mit Dialogs in der DLL... Gibt es dafür eine Alternative?

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Lazarus erstellt fehlerhafte DLLs (Win XP)

Beitrag von theo »

MitjaStachowiak hat geschrieben: Ich verwende übrigens ein 32 Bit-System. In Delphi hatte das alles schon funktioniert - auch mit Dialogs in der DLL... Gibt es dafür eine Alternative?
Ich wäre da vorsichtig. U.u. geht's mit der reinen Winapi Funktion:
http://msdn.microsoft.com/en-us/library ... 85%29.aspx" onclick="window.open(this.href);return false;
Hwnd null.

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Lazarus erstellt fehlerhafte DLLs (Win XP)

Beitrag von MitjaStachowiak »

Jo, MessageBox geht.
Für die Fehlersuche ist das nämlich nicht wegzudenken ;-)

Also was lernen wir daraus? "Verwende NIEMALS Dialogs in einer DLL!"
Jetzt bleibt noch die Frage, warum man Forms oder Controls nicht einbinden kann...
Vermutlich aus dem selben Grund, aus dem Dialogs nicht geht...

Für mein Programm ist das jedenfalls ein echtes Problem :-(

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Lazarus erstellt fehlerhafte DLLs (Win XP)

Beitrag von Hitman »

Verwende die LCL nicht in einer DLL ;-) DAS sollte man daraus lernen. (Also es geht schon, aber .... meh .... :D)

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Lazarus erstellt fehlerhafte DLLs (Win XP)

Beitrag von MitjaStachowiak »

Wie? Es geht schon?
Also die LResources.pp verwendet leider auch LCL, weswegen man sie nicht in einer DLL verwenden kann und so auch keine Ressourcen einbinden kann :-(

Ich habe schon eher erfolglos versucht, sie ohne das zum Laufen zu bringen...
Trotzdem - kann man irgendwie Ressourcen mit Lazarus in eine DLL packen?

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Lazarus erstellt fehlerhafte DLLs (Win XP)

Beitrag von theo »

MitjaStachowiak hat geschrieben:kann man irgendwie Ressourcen mit Lazarus in eine DLL packen?
Kommt drauf an, was man unter Ressourcen versteht.
Wenn es dir darum geht, Binärdaten in den Quelltext zu packen um diese zur Laufzeit verwenden zu können, hätte ich eine Lösung.

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: Lazarus erstellt fehlerhafte DLLs (Win XP)

Beitrag von felix96 »

theo hat geschrieben:
MitjaStachowiak hat geschrieben:kann man irgendwie Ressourcen mit Lazarus in eine DLL packen?
Kommt drauf an, was man unter Ressourcen versteht.
Wenn es dir darum geht, Binärdaten in den Quelltext zu packen um diese zur Laufzeit verwenden zu können, hätte ich eine Lösung.
Un wie währe die?
Wüde mich auch interessieren :P
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Lazarus erstellt fehlerhafte DLLs (Win XP)

Beitrag von theo »

felix96 hat geschrieben: Un wie währe die?
Wüde mich auch interessieren :P
(Rechtschreibung: 3 Fehler in zwei Zeilen.)

Ich hab mal diese Unit geschrieben:
http://www.theo.ch/lazarus/EncodeforUnit.pas" onclick="window.open(this.href);return false;

Das funktioniert so:
Bau dir eine kleine Anwendung mit einem TButton und einem TOpenDialog.
Dann schreib das rein:

Code: Alles auswählen

uses ClipBrd, EncodeforUnit;
...
procedure TForm1.Button1Click(Sender:TObject);
begin
  If OpenDialog1.Execute then
     ClipBoard.AsText:=EncodeFileforUnit(OpenDialog1.FileName);
end;
Wenn du damit eine Datei auswählst, ist diese nachher als Stringkonstante im Clipboard.
Die pastest du nun einfach in deinen Code oder in eine *.inc Datei und gibst der Konstante einen sinnvollen Namen.

Dann kannst du sie zur Laufzeit in einen Stream umwandeln und damit arbeiten.

z.B.:

Code: Alles auswählen

var Strm:TMemoryStream;
begin
  Strm:=TMemoryStream.create;
  DecodeFileFromUnit(TestC,Strm);
  Image1.Picture.LoadFromStream(Strm);
  Strm.free;
end;

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Lazarus erstellt fehlerhafte DLLs (Win XP)

Beitrag von MitjaStachowiak »

Ja, nach etwas herum tüfteln habe ich es so hin bekommen.
Vielleicht sollte man noch erwähnen, das es ohne das {$IFDEF WINDOWS}{$R die_dll.rc}{$ENDIF} nicht geht - ich hatte das versehentlich gelöscht :roll:

Perfekt ist die Lösung mit dem String --> Konvertieren --> Bytecode, finde ich, noch nicht (Wegen Performance)... Hoffentlich wird es irgendwann möglich sein, Ressourcen in eine DLL zu packen. Aber vorerst bin ich auch so zufrieden.

DANKE, theo

Antworten