AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie dll compilieren

Ein Thema von Schwedenbitter · begonnen am 12. Dez 2013 · letzter Beitrag vom 13. Dez 2013
Antwort Antwort
Seite 1 von 2  1 2      
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

Wie dll compilieren

  Alt 12. Dez 2013, 15:28
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 Library und ein 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
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wie dll compilieren

  Alt 12. Dez 2013, 15:36
Hast Du das DLL-Projekt denn auch kompiliert, und befindet sich diese kompilierte DLL auch in einem für das Programm erreichbaren Verzeichnis?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Pfaffe

Registriert seit: 29. Jan 2009
297 Beiträge
 
Delphi 12 Athens
 
#3

AW: Wie dll compilieren

  Alt 12. Dez 2013, 15:44
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Wie dll compilieren

  Alt 12. Dez 2013, 16:11
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Wie dll compilieren

  Alt 12. Dez 2013, 17:08
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: Wie dll compilieren

  Alt 12. Dez 2013, 20:01
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
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Wie dll compilieren

  Alt 12. Dez 2013, 20:31
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#8

AW: Wie dll compilieren

  Alt 13. Dez 2013, 11:07
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 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;
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#9

AW: Wie dll compilieren

  Alt 13. Dez 2013, 11:14
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#10

AW: Wie dll compilieren

  Alt 13. Dez 2013, 11:26
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 03:50 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