Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi VCL: Dll-Fenster schließt mir die Hauptanwendung (https://www.delphipraxis.net/183310-vcl-dll-fenster-schliesst-mir-die-hauptanwendung.html)

Der schöne Günther 30. Dez 2014 18:46

VCL: Dll-Fenster schließt mir die Hauptanwendung
 
Szenario:
  • VCL-Anwendung mit einer Dll.
  • Die DLL ist ebenfalls mit Delphi kompiliert und bietet ein Kommando an das ein VCL-Fenster erzeugt und anzeigt.
  • Schließt man das DLL-Fenster wird die gesamte Anwendung beendet!

Das DLL-Fenster wird so erzeugt:
Delphi-Quellcode:
   Application.CreateForm(TTestForm, newForm);
   newForm.Show();
Erzeugt man das Formular so:
Delphi-Quellcode:
   newForm := TTestForm.Create(nil);
   newForm.Show();
ist alles in Butter: Schließt man das DLL-Fenster läuft die Hauptanwendung normal weiter.

Warum ist das so? Frage ich in der Hauptanwendung nach
Delphi-Quellcode:
Application.MainFormHandle
ändert es sich nicht. Das scheint es schon mal nicht zu sein...

Namenloser 30. Dez 2014 19:52

AW: VCL: Dll-Fenster schließt mir die Hauptanwendung
 
Das Application-Objekt der DLL und der Hauptanwendung sind vermutlich nicht dieselbe Instanz. Daher denkt die DLL, dass das letzte und einzige Fenster geschlossen wurde, und würgt das Programm anschließend ab. Vermute ich. Habe damit nie gearbeitet.

Uwe Raabe 30. Dez 2014 22:06

AW: VCL: Dll-Fenster schließt mir die Hauptanwendung
 
Um das mal etwas zu verdeutlichen: Eine DLL bringt ihre eigene RTL und VCL/FMX Laufzeitumgebung mit, die sich von der des Hauptprogramms unterscheidet. Daher ist Application innerhalb der DLL eine ander Instanz als Application innerhalb der Exe. Will man in beiden Fällen dieselbe Instanz haben, muss man Packages verwenden.

Sir Rufo 30. Dez 2014 22:53

AW: VCL: Dll-Fenster schließt mir die Hauptanwendung
 
Egal wer da was mitbringt oder nicht: Fakt ist, dass eine Form, die "denkt", dass sie die MainForm ist, beim Schließen
Delphi-Quellcode:
Application.Terminate
aufruft. Dort wird u.a. auch
Delphi-Quellcode:
PostQuitMessage(0)
aufgerufen und das sendet dann ein WM_QUIT an die Anwendung :)

Darum wird die Anwendung geschlossen, denn die Form in der DLL, denkt, sie sei eine MainForm

Der schöne Günther 31. Dez 2014 09:49

AW: VCL: Dll-Fenster schließt mir die Hauptanwendung
 
Wahnsinn. Das heißt: Egal ob DLLs oder nicht- Hätte ich ein Nicht-VCL-Fenster mir selbst erzeugt würde das auch einfach mal geschlossen werden. Nett.

Ich glaube, ich gewöhne mir dieses schräge TApplication ganz ab...

Sir Rufo 31. Dez 2014 09:56

AW: VCL: Dll-Fenster schließt mir die Hauptanwendung
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1285036)
Wahnsinn. Das heißt: Egal ob DLLs oder nicht- Hätte ich ein Nicht-VCL-Fenster mir selbst erzeugt würde das auch einfach mal geschlossen werden. Nett.

Ich glaube, ich gewöhne mir dieses schräge TApplication ganz ab...

Wieso das denn?

Du darfst nur in einer DLL nicht mit
Delphi-Quellcode:
TApplication
herumspielen, dann wird alles gut.

Uwe Raabe 31. Dez 2014 10:28

AW: VCL: Dll-Fenster schließt mir die Hauptanwendung
 
Zitat:

Zitat von Sir Rufo (Beitrag 1285037)
Zitat:

Zitat von Der schöne Günther (Beitrag 1285036)
Wahnsinn. Das heißt: Egal ob DLLs oder nicht- Hätte ich ein Nicht-VCL-Fenster mir selbst erzeugt würde das auch einfach mal geschlossen werden. Nett.

Ich glaube, ich gewöhne mir dieses schräge TApplication ganz ab...

Wieso das denn?

Du darfst nur in einer DLL nicht mit
Delphi-Quellcode:
TApplication
herumspielen, dann wird alles gut.

Bei einem Nicht-VCL-Fenster wäre ich mir da gar nicht so sicher, denn das würde
Delphi-Quellcode:
TApplication
und insbesondere
Delphi-Quellcode:
TApplication.MainForm
ja gar nicht kennen (das
Delphi-Quellcode:
Application.Terminate
kommt immerhin in
Delphi-Quellcode:
TCustomForm.Close
).

Abgesehen davon ist es mit Delphi und allem was damit einher kommt wie mit jedem Werkzeug: man muss damit umzugehen wissen oder man muss es eben lernen.

Sir Rufo 31. Dez 2014 10:44

AW: VCL: Dll-Fenster schließt mir die Hauptanwendung
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1285040)
Zitat:

Zitat von Sir Rufo (Beitrag 1285037)
Zitat:

Zitat von Der schöne Günther (Beitrag 1285036)
Wahnsinn. Das heißt: Egal ob DLLs oder nicht- Hätte ich ein Nicht-VCL-Fenster mir selbst erzeugt würde das auch einfach mal geschlossen werden. Nett.

Ich glaube, ich gewöhne mir dieses schräge TApplication ganz ab...

Wieso das denn?

Du darfst nur in einer DLL nicht mit
Delphi-Quellcode:
TApplication
herumspielen, dann wird alles gut.

Bei einem Nicht-VCL-Fenster wäre ich mir da gar nicht so sicher, denn das würde
Delphi-Quellcode:
TApplication
und insbesondere
Delphi-Quellcode:
TApplication.MainForm
ja gar nicht kennen (das
Delphi-Quellcode:
Application.Terminate
kommt immerhin in
Delphi-Quellcode:
TCustomForm.Close
).

Abgesehen davon ist es mit Delphi und allem was damit einher kommt wie mit jedem Werkzeug: man muss damit umzugehen wissen oder man muss es eben lernen.

Da war mir der Bezug, wo denn die Nicht-VCL-Form erzeugt worden wäre hätten sollen nicht klar.

In der DLL? Da würde es auch reichen die Form nicht mit
Delphi-Quellcode:
TApplication
zu verbandeln.
In der Anwendung selber? Ja, dann fliegen alle Forms weg :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:38 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