![]() |
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:
und ein
Library
Delphi-Quellcode:
und würde das gern testen. Das Programm wird kompiliert, lässt sich aber nicht ausführen, weil die DLL-Datei nicht erstellt wird.
Program
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:
und das "Haupt"programm sieht dann so aus:
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.
Delphi-Quellcode:
Sollten schon jetzt grobe Schnitzer drin sein, freue ich mich über Hinweise, bevor ich dann später irgend welche schlimmeren Dinge ausbaden muss.
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. Gruß & Dank, Alex |
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?
|
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.
|
AW: Wie dll compilieren
Zitat:
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) |
AW: Wie dll compilieren
Zitat:
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. |
AW: Wie dll compilieren
Danke erstmal für die zahlreichen Antworten.
[QUOTE=himitsu;1239587] Zitat:
Das mit dem Release habe ich von ![]() Den Tip mit dem Erstellen einer Projektgruppe werde ich morgen gleich mal testen. Gruß, Alex |
AW: Wie dll compilieren
Zitat:
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) |
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:
jedenfalls falsch und ich sollte - oder vielmehr muss - Free nehmen. Wenn ich das weiter zutreffend deute, sollte dann auch sowas gehen wie:
Release
Delphi-Quellcode:
With TaDLLForm.Create(nil) Do
Try ShowModal; Finally Free; End; |
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. |
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 14:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz