DLL erstellen, mit Formular.
-
- Beiträge: 1466
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
- CPU-Target: 32/64Bit
DLL erstellen, mit Formular.
Hallo,
Ich möchte eine DLL erstellen, die wird vom Haupt-Programm aufgerufen. In der DLL soll ein Formular enthalten sein.
Haupt-Programm >> Call in DLL >> Anzeige Formular mit Optionen >> Rückgabewert ist String
Ich habe hier ein Beispiel für DLL Erstellung gefunden:
http://www.freepascal.org/docs-html/prog/progse54.html
Wenn ich jetzt das Formular mit einbinde, dann zeigt der Compiler jede Menge Fehler:
EleLaExt.lpr(24,1) Error: Undefined symbol: WSRegisterCustomImageList
EleLaExt.lpr(24,1) Error: Undefined symbol: WSRegisterMenuItem
EleLaExt.lpr(24,1) Error: Undefined symbol: WSRegisterMenu
EleLaExt.lpr(24,1) Error: Undefined symbol: WSRegisterMainMenu
EleLaExt.lpr(24,1) Error: Undefined symbol: WSRegisterPopupMenu
EleLaExt.lpr(24,1) Error: Undefined symbol: WSRegisterDragImageList
: : : :
Weiß jemand ein Beispiel wie das richtig geht?
Danke im Vorraus.
Grüße Markus.
Ich möchte eine DLL erstellen, die wird vom Haupt-Programm aufgerufen. In der DLL soll ein Formular enthalten sein.
Haupt-Programm >> Call in DLL >> Anzeige Formular mit Optionen >> Rückgabewert ist String
Ich habe hier ein Beispiel für DLL Erstellung gefunden:
http://www.freepascal.org/docs-html/prog/progse54.html
Wenn ich jetzt das Formular mit einbinde, dann zeigt der Compiler jede Menge Fehler:
EleLaExt.lpr(24,1) Error: Undefined symbol: WSRegisterCustomImageList
EleLaExt.lpr(24,1) Error: Undefined symbol: WSRegisterMenuItem
EleLaExt.lpr(24,1) Error: Undefined symbol: WSRegisterMenu
EleLaExt.lpr(24,1) Error: Undefined symbol: WSRegisterMainMenu
EleLaExt.lpr(24,1) Error: Undefined symbol: WSRegisterPopupMenu
EleLaExt.lpr(24,1) Error: Undefined symbol: WSRegisterDragImageList
: : : :
Weiß jemand ein Beispiel wie das richtig geht?
Danke im Vorraus.
Grüße Markus.
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Beiträge: 957
- Registriert: Mo 11. Sep 2006, 22:56
Re: DLL erstellen, mit Formular.
http://bugs.freepascal.org/view.php?id=1866
http://forum.lazarus.freepascal.org/ind ... ic=16621.0
Das geht wohl nicht,wenn ichs richtig verstanden habe.
http://forum.lazarus.freepascal.org/ind ... ic=16621.0
Das geht wohl nicht,wenn ichs richtig verstanden habe.
-
- Beiträge: 619
- Registriert: Mi 9. Mär 2011, 16:34
- OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
- CPU-Target: 64Bit
- Wohnort: seit 01.06.2011 in Wahlstedt
Re: DLL erstellen, mit Formular.
Müste ich zugegeben mal in meinen ALTEN Unterlagen suchen. Weiß, das ich da schon mal etwas via Delphi erfolgreich geschieben hatte. wenn ich was finde, geb ich dir bescheid...
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2640
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: DLL erstellen, mit Formular.
Ich stehe vor dem gleichen Problem und habe auch schon die Einträge im Bugtracker und Forum gefunden. ABER: ich habe hier eine lauffähige Version.
Die .lpr der DLL sieht so aus:
Im Clientprogramm wird dann die DLL eingebunden:
Und der Aufruf funktioniert auch:
Und schon erscheint das Form aus der DLL und das Memo enthält "Blafasel". Wichtig ist in der DLL die EIbindung von Interfaces und Forms, sowie der Aufruf von Application.Initialize.
ABER: Ich weiß nicht wie stabil das alles ist, denn laut den bekannten Meldungen soll es ja NICHT gehen. Auch ist das nur ein schneller Test unter Windows, ich weiß nicht ob da noch Fallstricke lauern. Deswegen bin ich auch etwas unsicher, ob ich diese Konstruktion wirklich in ein richtiges Projekt übernehmen sollte. Vielleicht hat ja noch jemand eine Meinung dazu.
Michael
Die .lpr der DLL sieht so aus:
Code: Alles auswählen
library server;
{$mode objfpc}
{$H+}
{$DEFINE USE_BIN_STR}
uses
Classes, SysUtils, Interfaces, Windows, LCLType, Unit1, Forms;
{$R *.res}
procedure ShowText(AText: String); stdcall;
begin
try
Form1 := TForm1.Create(Application);
Form1.Memo1.Text := AText;
Form1.ShowModal;
finally
FreeAndNil(Form1);
end;
end;
exports
ShowText;
begin
Application.Initialize;
end.
Im Clientprogramm wird dann die DLL eingebunden:
Code: Alles auswählen
procedure DllShowText(AText: String); stdcall; external 'server.dll' name 'ShowText';
Und der Aufruf funktioniert auch:
Code: Alles auswählen
DllShowText('Blafasel');
Und schon erscheint das Form aus der DLL und das Memo enthält "Blafasel". Wichtig ist in der DLL die EIbindung von Interfaces und Forms, sowie der Aufruf von Application.Initialize.
ABER: Ich weiß nicht wie stabil das alles ist, denn laut den bekannten Meldungen soll es ja NICHT gehen. Auch ist das nur ein schneller Test unter Windows, ich weiß nicht ob da noch Fallstricke lauern. Deswegen bin ich auch etwas unsicher, ob ich diese Konstruktion wirklich in ein richtiges Projekt übernehmen sollte. Vielleicht hat ja noch jemand eine Meinung dazu.
Michael
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- Beiträge: 1466
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
- CPU-Target: 32/64Bit
Re: DLL erstellen, mit Formular.
@Michael:
Vielen Dank!
Erst mal scheint es zu klappen.
Das hat gefehlt
Begin
Application.Initialize;
end.
Vielen Dank!
Erst mal scheint es zu klappen.
Das hat gefehlt
Begin
Application.Initialize;
end.
Zuletzt geändert von MmVisual am Mo 30. Apr 2012, 21:45, insgesamt 2-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2640
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: DLL erstellen, mit Formular.
Du kannst AFAIK kein TApplication übergeben in eine DLL-Funktion. Was wohl klappen würde, wäre das Handle der Application.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- Beiträge: 1466
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
- CPU-Target: 32/64Bit
Re: DLL erstellen, mit Formular.
Ich versuche noch das Main-Formular zu übergeben, denn jetzt ist der Dialog nicht wirklich Modal an die Main-Form verbunden.
EleLa - Elektronik Lagerverwaltung - www.elela.de
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2640
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: DLL erstellen, mit Formular.
MmVisual hat geschrieben:Ich versuche noch das Main-Formular zu übergeben, denn jetzt ist der Dialog nicht wirklich Modal an die Main-Form verbunden.
Wenn das bei dir klappt, wäre ich für einen Tipp dankbar. Denn genau das habe ich nicht geschafft.
Ich werde auch mal parallel meine Lösung an die Lazarus-Mailingliste senden und um Meinungen bitten. Irgendwie irritiert mich, dass ich etwas zum Laufen bekomme was eigentlich nicht laufen sollte.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- Beiträge: 1466
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
- CPU-Target: 32/64Bit
Re: DLL erstellen, mit Formular.
Ich habe hier einen Trick. Jetzt ist die Form echt Modal.
Der Haken: Wenn die EXE beendet wird, kommen gaaanz viele Adressen mit Zugriffsverletzung.
Der Haken: Wenn die EXE beendet wird, kommen gaaanz viele Adressen mit Zugriffsverletzung.
Code: Alles auswählen
library EleLaExt;
{$mode objfpc}
{$H+}
uses
Classes, SysUtils, Interfaces, Windows, LCLType, Forms,
Controls, ZConnection,
{ you can add units after this }
fRMA;
function GetDLLFct(): String; cdecl;
Begin
Result := 'GetRMACode'; // String mit Funktionen der DLL, getrennt mit '|'
End;
// Formular für RMA Codegenerierung
function GetRMACode(App: TApplication; Scr: TScreen; DB: TZConnection; sValue: String): String; cdecl;
Var AppOld: TApplication;
ScrOld: TScreen;
Begin
Result := sValue;
AppOld := Application;
ScrOld := Screen;
Application := App;
Screen := Scr;
frmRMA := TfrmRMA.Create(App.MainForm);
Try
frmRMA.DB := DB;
frmRMA.sRMA := sValue;
If frmRMA.ShowModal = mrOK Then
Result := frmRMA.sRMA;
FreeAndNil(frmRMA);
Except
On E: Exception do
Begin
FreeAndNil(frmRMA);
Result := 'Error: ' + E.Message;
end;
end;
Application := AppOld;
Screen := ScrOld;
End;
exports
GetDLLFct,
GetRMACode;
Begin
Application.Initialize;
end.
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Beiträge: 1466
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
- CPU-Target: 32/64Bit
Re: DLL erstellen, mit Formular.
Ich versuche gerade einen etwas anderen Weg.
Mich interessiert ja nur das Formular und es sollte im Hauptprogramm laufen. So dachte ich, ich übergebe aus der DLL das Formular als "TComponentClass" und erzeuge es dann im Hauptprogramm.
Das Formular kommt, ist aber auch nicht modal.
Kennt jemand eine Möglichkeit, wie man die ganze Klasse TForm, samt allen Steuerelementen kopieren kann, so dass ich die aus der DLL heraus in meine App bekomme?
Mich interessiert ja nur das Formular und es sollte im Hauptprogramm laufen. So dachte ich, ich übergebe aus der DLL das Formular als "TComponentClass" und erzeuge es dann im Hauptprogramm.
Das Formular kommt, ist aber auch nicht modal.
Kennt jemand eine Möglichkeit, wie man die ganze Klasse TForm, samt allen Steuerelementen kopieren kann, so dass ich die aus der DLL heraus in meine App bekomme?
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Beiträge: 1466
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
- CPU-Target: 32/64Bit
Re: DLL erstellen, mit Formular.
Es geht jetzt richtig, hier der Workaround für Windows:
http://bugs.freepascal.org/view.php?id=7182
http://bugs.freepascal.org/view.php?id=7182
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Beiträge: 619
- Registriert: Mi 9. Mär 2011, 16:34
- OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
- CPU-Target: 64Bit
- Wohnort: seit 01.06.2011 in Wahlstedt
Re: DLL erstellen, mit Formular.
Mal eine Frage von meiner Seite? wie würde dies denne aussehen, wenn's Plattvorübergreifend laufen sollte? würde dann die Unitklausel:
reichen oder geht das schief?
Code: Alles auswählen
uses
Classes, SysUtils, Interfaces, {$IFDEF Win}Windows,{$ENDDIF} LCLType, Unit1, Forms;
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D
-
- Beiträge: 657
- Registriert: Sa 9. Jan 2010, 17:32
- OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
- CPU-Target: 64Bit
Re: DLL erstellen, mit Formular.
Maik81ftl hat geschrieben:Mal eine Frage von meiner Seite? wie würde dies denne aussehen, wenn's Plattvorübergreifend laufen sollte? würde dann die Unitklausel:reichen oder geht das schief?Code: Alles auswählen
uses
Classes, SysUtils, Interfaces, {$IFDEF Win}Windows,{$ENDDIF} LCLType, Unit1, Forms;
Unit windows, einfach gar nicht benutzen. Stattdessen sysutils, LCL und sonstige Units nehmen.
-
- Beiträge: 1466
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
- CPU-Target: 32/64Bit
Re: DLL erstellen, mit Formular.
In der DLL werden direkt Windows API Funktionen wie
- SetWindowLongPtr
- SetWindowPos
Ich bezweifle dass es diese Funktionen auch unter Linux gibt.
Somit für Linux muss ein anderer Trick her halten.
- SetWindowLongPtr
- SetWindowPos
Ich bezweifle dass es diese Funktionen auch unter Linux gibt.
Somit für Linux muss ein anderer Trick her halten.
EleLa - Elektronik Lagerverwaltung - www.elela.de