DLL erstellen, mit Formular.

Rund um die LCL und andere Komponenten
MmVisual
Beiträge: 1127
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3)
CPU-Target: 32/64Bit

DLL erstellen, mit Formular.

Beitrag von MmVisual »

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.

creed steiger
Beiträge: 954
Registriert: Mo 11. Sep 2006, 22:56

Re: DLL erstellen, mit Formular.

Beitrag von creed steiger »


MmVisual
Beiträge: 1127
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3)
CPU-Target: 32/64Bit

Re: DLL erstellen, mit Formular.

Beitrag von MmVisual »

:( :( :( :( :( :( :( :( :( :( :( :( :( :( :( :( :( :( :( :( :( :( :( :( :( :( :( :(

Maik81ftl
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.

Beitrag von Maik81ftl »

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

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2285
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.8, FPC 3.0.4)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: DLL erstellen, mit Formular.

Beitrag von m.fuchs »

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:

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

MmVisual
Beiträge: 1127
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3)
CPU-Target: 32/64Bit

Re: DLL erstellen, mit Formular.

Beitrag von MmVisual »

@Michael:

Vielen Dank!

Erst mal scheint es zu klappen.

Das hat gefehlt :D
Begin
Application.Initialize;
end.
Zuletzt geändert von MmVisual am Mo 30. Apr 2012, 21:45, insgesamt 2-mal geändert.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2285
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.8, FPC 3.0.4)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: DLL erstellen, mit Formular.

Beitrag von m.fuchs »

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

MmVisual
Beiträge: 1127
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3)
CPU-Target: 32/64Bit

Re: DLL erstellen, mit Formular.

Beitrag von MmVisual »

Ich versuche noch das Main-Formular zu übergeben, denn jetzt ist der Dialog nicht wirklich Modal an die Main-Form verbunden.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2285
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.8, FPC 3.0.4)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: DLL erstellen, mit Formular.

Beitrag von m.fuchs »

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

MmVisual
Beiträge: 1127
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3)
CPU-Target: 32/64Bit

Re: DLL erstellen, mit Formular.

Beitrag von MmVisual »

Ich habe hier einen Trick. Jetzt ist die Form echt Modal.
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.

MmVisual
Beiträge: 1127
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3)
CPU-Target: 32/64Bit

Re: DLL erstellen, mit Formular.

Beitrag von MmVisual »

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?

MmVisual
Beiträge: 1127
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3)
CPU-Target: 32/64Bit

Re: DLL erstellen, mit Formular.

Beitrag von MmVisual »

Es geht jetzt richtig, hier der Workaround für Windows:
http://bugs.freepascal.org/view.php?id=7182

Maik81ftl
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.

Beitrag von Maik81ftl »

Mal eine Frage von meiner Seite? wie würde dies denne aussehen, wenn's Plattvorübergreifend laufen sollte? würde dann die Unitklausel:

Code: Alles auswählen

uses
  Classes, SysUtils, Interfaces, {$IFDEF Win}Windows,{$ENDDIF} LCLType, Unit1, Forms;
reichen oder geht das schief?
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

carli
Beiträge: 660
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.

Beitrag von carli »

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:

Code: Alles auswählen

uses
  Classes, SysUtils, Interfaces, {$IFDEF Win}Windows,{$ENDDIF} LCLType, Unit1, Forms;
reichen oder geht das schief?


Unit windows, einfach gar nicht benutzen. Stattdessen sysutils, LCL und sonstige Units nehmen.

MmVisual
Beiträge: 1127
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3)
CPU-Target: 32/64Bit

Re: DLL erstellen, mit Formular.

Beitrag von MmVisual »

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.

Antworten