Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wie dll compilieren (https://www.delphipraxis.net/178036-wie-dll-compilieren.html)

Schwedenbitter 12. Dez 2013 14:28

Wie dll compilieren
 
Hallo,

ich versuche mich gerade daran, sich häufig ändernden Code in eine DLL auszulagern. Zu diesem Zweck betreibe ich natürlich tests. Allerdings komme ich nicht wirklich weiter. Ich habe eine
Delphi-Quellcode:
Library
und ein
Delphi-Quellcode:
Program
und würde das gern testen. Das Programm wird kompiliert, lässt sich aber nicht ausführen, weil die DLL-Datei nicht erstellt wird.

Wie macht man das?

Ich habe bereits im Internet einige Tutorials zum Thema DLL angeschaut. Auf diese Frage wird nirgends eingegangen. Ich gehe deshalb davon aus, dass sich die DLL mehr oder weniger automatisch kompilieren sollte.
Da es aber evtl. auch am Code liegen könnte, habe ich diesen hier angefügt:
Delphi-Quellcode:
Library DLLForm;

Uses Classes, Controls, Forms, StdCtrls, ExtCtrls;

Type
   TaDLLForm = Class(TForm)
      Btn1   : TButton;
      Btn2   : TButton;
      Timer1: TTimer;
      Procedure DoSomething(Sender: TObject);
   End;

{$R *.dfm}

Procedure TaDLLForm.DoSomething(Sender: TObject);
Begin
   Timer1.Enabled:=False;
   If     (Sender = Btn1  ) Then Caption:='Button 1 gedrückt.'
   Else If (Sender = Btn2  ) Then Caption:='Button 2 gedrückt.'
   Else If (Sender = Timer1) Then Caption:='Lange nichts gedrückt.'
   Else                          Caption:='Was war das denn?';
   Timer1.Enabled:=True;
End;

Procedure DLLFormular; StdCall;
Var
   aDLLForm      : TaDLLForm;
Begin
   aDLLForm:=aDLLForm.Create(Application);
   Try
      aDLLForm.ShowModal;
   Finally
      aDLLForm.Release;
   End;
End;

Exports
   DLLFormular;

Begin
End.
und das "Haupt"programm sieht dann so aus:
Delphi-Quellcode:
Unit _main;

Interface

Uses Classes, Controls, Forms, StdCtrls;

Type
   TAppForm = Class(TForm)
      Button1: TButton;
      Procedure Button1Click(Sender: TObject);
   End;

Var
   AppForm : TAppForm;

Procedure DLLFormular; Stdcall; External 'DLLForm.dll';   

Implementation

{$R *.dfm}

Procedure TAppForm.Button1Click(Sender: TObject);
Begin
   DLLFormular;
End;

End.
Sollten schon jetzt grobe Schnitzer drin sein, freue ich mich über Hinweise, bevor ich dann später irgend welche schlimmeren Dinge ausbaden muss.

Gruß & Dank, Alex

DeddyH 12. Dez 2013 14:36

AW: Wie dll compilieren
 
Hast Du das DLL-Projekt denn auch kompiliert, und befindet sich diese kompilierte DLL auch in einem für das Programm erreichbaren Verzeichnis?

Pfaffe 12. Dez 2013 14:44

AW: Wie dll compilieren
 
Um die DLL "DLLForm" zu debuggen, geht man in Delphi auf den Menüpunkt Start-Parameter und trägt das Programm "Haupt" als Host-Anwendung ein, welches die DLL aufrufen soll.

himitsu 12. Dez 2013 15:11

AW: Wie dll compilieren
 
Zitat:

Delphi-Quellcode:
   aDLLForm:=aDLLForm.Create(Application);
   Try
      aDLLForm.ShowModal;
   Finally
      aDLLForm.Release;
   End;

Sicher, daß du ein Problem mit der DLL hast?

Delphi-Quellcode:
   aDLLForm:=TaDLLForm.Create(nil); // Klasse!!!
   Try
      aDLLForm.ShowModal;
   Finally
      aDLLForm.Free; // Free - Free gibt sofort frei und Release wenn es "Lust" dazu hat
   End;


Und die Sache mit der VCL in einer DLL wurde hier schon oft genannt.
Da kann es so ein paar Problemchen geben, da die VCL der DLL von der Message-Verarbeitung der EXE bearbeitet wird (vorallem da du via Release das destroy aus der DLL raus beim Aufrufer machen lässt )
Und die Forms/VCL der EXE werden beim ShowModal von Message-Verarbeitung der DLL bearbeitet.

(vorausgesetzt die EXE ist eine Delphi- oder C++Builder-Anwendung und/oder es gibt noch weitere DLLs mit einer "eigenen" VCL)

jaenicke 12. Dez 2013 16:08

AW: Wie dll compilieren
 
Zitat:

Zitat von Pfaffe (Beitrag 1239583)
Um die DLL "DLLForm" zu debuggen, geht man in Delphi auf den Menüpunkt Start-Parameter und trägt das Programm "Haupt" als Host-Anwendung ein, welches die DLL aufrufen soll.

Es genügt auch, wenn beide Projekte in der selben Projektgruppe sind, zumindest bei aktuellen Delphiversionen.

Und per Rechtsklick in der Projektverwaltung auf eines der Projekte kann man unter Abhängigkeiten festlegen, dass das andere automatisch erstellt werden soll bevor das eigene erstellt wird. So braucht man immer nur ein Projekt starten und das andere wird automatisch vorher erstellt.

Schwedenbitter 12. Dez 2013 19:01

AW: Wie dll compilieren
 
Danke erstmal für die zahlreichen Antworten.
[QUOTE=himitsu;1239587]
Zitat:

Sicher, daß du ein Problem mit der DLL hast?
Die Frage verstehe ich nicht.

Das mit dem Release habe ich von hier. Wenn ich irgendwann die DLL mal kompiliert bekomme, werde ich den Unterschied austesten. Heute komme ich leider nicht mehr dazu.

Den Tip mit dem Erstellen einer Projektgruppe werde ich morgen gleich mal testen.

Gruß, Alex

himitsu 12. Dez 2013 19:31

AW: Wie dll compilieren
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1239635)
Delphi-Quellcode:
   aDLLForm:=aDLLForm.Create(Application); // <<<<<<<
   Try
      aDLLForm.ShowModal;
   Finally
      aDLLForm.Release;
   End;

Das ist nicht fehlerhast, weil es in einer DLL steht.
Das ist auch schon in einer EXE falsch.

Variable := Klasse.Create(Owner);

Man "kann" den Constructor zwar auch über eine Variable aufrufen, aber nur, wenn vorher der Objekt-Speicher reserviert und initialisiert wurde.


Und der Owner ist nicht wichtig, da die Klasse eh sofort wieder freigegeben wird. (der Owner ist sozusagen also schon das try-finally)

Release sendet nur eine Message an die Forms (PostMessage), welche dann irgendwann später verarbeitet wird.
PS: Auf soeine Weise wurde bei uns letztens mal ein ShowMessage in den Jordan gerissen.
Die eine modale Form wurde via ModalResult "geschlossen", danach wurde direkt eine MessageBox angezeigt.
Diese MessageBox hing sich an die ActiveForm, welche "noch" die modale Form war, da sie nicht "sofort" geschlossen wurde.
Viele Codezeilen später kam die GUI dann dazu die Schließen-Message zu verarbeiten, gab die Form frei und nahm dabei die angehängte MessageBox mit.
(FastReport ist teilweise schon ein echt krankes Teil)

Schwedenbitter 13. Dez 2013 10:07

AW: Wie dll compilieren
 
Abermals danke für die ausführliche Erklärung. Dennoch habe ich 2 Fragen:

Meine Library wird immer noch nicht als DLL kompiliert. Ich wollte es daher über den Vorschlag einer Projektgruppe probieren. Gibt es eine Möglichkeit, eine solche nachträglich zu bauen? Falls ja, wie geht das?
Ich hatte mangels Wissen darum zunächst versucht, eine neue Projektgruppe zu erstellen und hatte den Plan, dann dort die bestehenden Dateien reinzuschummeln. Aber auch hier komme ich nicht weiter.
Ich erwarte wie immer keine Erklärungen hier. Wäre zwar schön. Aber ich bin bereit zu lesen und würde mich daher über einen Link riesig freuen...

Wenn ich das richtig verstanden habe, ist
Delphi-Quellcode:
Release
jedenfalls falsch und ich sollte - oder vielmehr muss - Free nehmen. Wenn ich das weiter zutreffend deute, sollte dann auch sowas gehen wie:
Delphi-Quellcode:
   With TaDLLForm.Create(nil) Do
   Try
      ShowModal;
   Finally
      Free;
   End;

DeddyH 13. Dez 2013 10:14

AW: Wie dll compilieren
 
Der Code sollte so funktionieren. Was Du noch versuchen könntest: pack das Formular der DLL in eine eigene Unit wie in "normalen" Projekten auch. Im Quältext des DLL-Projektes bindest Du dann diese Unit ein, so dass das etwa so aussieht:
Delphi-Quellcode:
Library DLLForm;

Uses Forms, DeineFormUnit;

{$R *.res}

Procedure DLLFormular; StdCall;
Begin
  with TaDLLForm.Create(nil) do
    Try
      ShowModal;
    Finally
      Free;
    End;
End;

Exports
   DLLFormular;

Begin
End.

bcvs 13. Dez 2013 10:26

AW: Wie dll compilieren
 
Hast du überhaupt ein eigenes Projekt (*.dpr) für die DLL?

Ich habe gerade mal folgendes gemacht: (D2007)

Datei - Neu - Weitere - Dll-Experte

Delphi erzeugt damit ein Grundgerüst für ein DLL-Projekt. Deinen Code habe ich einfach da rein kopiert und kompiliert. Der Compiler meckert über das {$R *.dfm}. Klar, die DLL selbst hat ja auch keine dfm, die müsste in der Formular-Unit eingebunden werden.

Ansonsten lässt sich der Code aber kompilieren und ich erhalte eine DLLForm.dll


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:59 Uhr.
Seite 1 von 2  1 2      

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