![]() |
Delphi-Version: 7
mehrere Formular-DLL laden/entladen
Hallo,
ich habe ein kleines Demo-Projekt mit Luckies Code ![]() In dem Formular sind 2 Buttons, die jeweils eine Formular-DLL laden. Also folgende Reihenfolge: -Button1 drücken, lädt Form1 -Button2 drücken, lädt Form2 -Form1 beenden, beendet nicht, wie zu erwarten, Form1 sondern Form2 Es wird, egal welche DLL zuerst aufgerufen wird, immer in umgekehrter Reihenfolge des Ladevorgangs enladen.
Delphi-Quellcode:
Weiß jemand Rat?
{-----------------------------------------------------------------------------
Project: Formular in DLL Description: Aufruf eines Formulares aus einer DLL Author: Michael Puff, http://michael-puff.de Date: 2011-12-22 -----------------------------------------------------------------------------} ... procedure TForm1.btn1Click(Sender: TObject); type TShowForm = procedure; stdcall; var DLLForm1: THandle; ShowForm: TShowForm; begin DLLForm1 := LoadLibrary('c:\Test\Form1.dll'); if DLLForm1 <> 0 then begin @ShowForm := GetProcAddress(DLLForm1, 'Form1Anzeigen'); if Assigned(ShowForm) then begin ShowForm; FreeLibrary(DLLForm1); end else ShowMessage(SysErrorMessage(GetLastError)); end else ShowMessage(SysErrorMessage(GetLastError)); end; procedure TForm1.btn2Click(Sender: TObject); type TShowForm = procedure; stdcall; var DLLForm2: THandle; ShowForm: TShowForm; begin DLLForm2 := LoadLibrary('c:\Test\Form2.dll'); if DLLForm2 <> 0 then begin @ShowForm := GetProcAddress(DLLForm2, 'Form2Anzeigen'); if Assigned(ShowForm) then begin ShowForm; FreeLibrary(DLLForm2); end else ShowMessage(SysErrorMessage(GetLastError)); end else ShowMessage(SysErrorMessage(GetLastError)); end; |
AW: mehrere Formular-DLL laden/entladen
Spontan wäre es mir jetzt sehr unheimlich die Dll gleich wieder nach dem Ausführen einer Funktion (mit ihrer von der Hauptanwendung unabhängigen VCL) gleich wieder rauszuwerfen. Warum machst du direkt wieder ein
Delphi-Quellcode:
?
FreeLibrary
Was ist, wenn man das auf "später" vertagt, ändert das etwas? Ich sitze zufälligerweise an einem sehr ähnlichen Projekt (mehrere verschiedene dlls die auch (nach Anfrage) mehrere Formen erzeugen und anzeigen), allerdings nehme ich die auch erst wieder aus dem Speicher, wenn wirklich alles zu Ende ist. Und da wird auch alles geschlossen wie es sollte... |
AW: mehrere Formular-DLL laden/entladen
Zitat:
FreeLibrary wird erst ausgeführt, wenn das Formular geschlossen wird. Aber hier sieht man schön im Debugger, das in der falschen Procedure weiter gemacht wird. |
AW: mehrere Formular-DLL laden/entladen
ShowForm sind zwar zwei lokale Variablen, vielleicht löst der Compiler da irgendetwas falsch auf, probier mal die beiden mit ShowForm1 und ShowForm2 zu bezeichnen.
|
AW: mehrere Formular-DLL laden/entladen
Mir ist es immer noch zu gruselig, direkt dahinter ein
Delphi-Quellcode:
. Was gibt der Aufruf denn zurück?
FreeLibrary
|
AW: mehrere Formular-DLL laden/entladen
Zitat:
Zitat:
Zitat:
|
AW: mehrere Formular-DLL laden/entladen
Hast Du die Formular mal einzeln ausprobiert? Und wie sieht die FormAnzeigen-Methode in der DLL genau aus?
|
AW: mehrere Formular-DLL laden/entladen
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal ein Testprojekt angehängt.
|
AW: mehrere Formular-DLL laden/entladen
Ich habe (bislang) nicht verstanden, wozu das
Delphi-Quellcode:
-Objekt eigentlich gut ist. Deshalb habe ich es in deinem Testprojekt einmal so abgeändert, wie ich es bei mir tue:
Application
Und es geht - Die Fenster werden so geschlossen, wie man auch draufklickt. PS: Zitat:
Delphi-Quellcode:
FreeLibrary
|
AW: mehrere Formular-DLL laden/entladen
Zitat:
Delphi-Quellcode:
reicht ja nicht.
TForm.Create()
|
AW: mehrere Formular-DLL laden/entladen
Hallo -
Ich habe nur eine (bzw zwei) Zeilen hinzugefügt:
Delphi-Quellcode:
library Formular1;
uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} procedure Form1Anzeigen(parameter:Integer); stdcall; begin TForm1.Create(nil).Show(); // <------------- Exit(); try Application.CreateForm(TForm1, Form1); Application.Run; finally Form1.Free; end end; exports Form1Anzeigen; end. Bislang fehlen der dll dann natürlich noch die Methoden um die Form evtl. wieder zu verstecken und zu zerstören. Und natürlich sollte man sich die Form nicht anonym erzeugen sondern halt noch irgendwo merken (um sie dann später vernünftig wieder vom Speicher nehmen zu können) und sich noch Gedanken machen, was passieren soll, wenn "von außen" die Erstellung einer Form angefordert wird, aber schon eine da ist (z.B. alte vorher schließen und zerstören). Ob sich da dieses
Delphi-Quellcode:
-Objekt selbst drum gekümmert hätte weiß ich nicht.
Application
|
AW: mehrere Formular-DLL laden/entladen
Ähmm.., ja es fehlt ziemlich alles.
Erstaunlich das es, zumindist unter W7, überhaupt ohne Exception läuft. Da muss ich erstmal drüber nachdenken. |
AW: mehrere Formular-DLL laden/entladen
Hallo -
ich habe mit Delphi noch keine wirklich Erfahrung, deswegen erschien es mir so am sinnvollsten. Die Dll hat ihre eigene VCL (die Oberfläche könnte deswegen auch schön in einem separaten Thread laufen) und erstellt und zerstört eigentlich nur Formen wie sie sollte. Wenn das Hauptprogramm sich sicher ist, die dll nicht mehr zu brauchen, werfe ich sie mittels FreeLibrary wieder heraus. Auf die Weise fahre ich bislang eigentlich ganz, wo (bzw. aus welchem Grund) hättest denn Exceptions erwartet? |
AW: mehrere Formular-DLL laden/entladen
Zitat:
Und eine Exception habe ich nicht erwartet sondern unter XP bekommen. Dort läuft dein Test nicht. |
AW: mehrere Formular-DLL laden/entladen
Wenn ich (mich anschicke) die dll direkt nach dem Aufruf wieder zu entfernen stürzt es bei mir ab (Win7/64). Wird das später gemacht: Kein Problem.
In dieser Woche kann ich wahrscheinlich an keinen XP-Rechner mehr kommen, deshalb blieb mir nur der XP-Kompatiblitätsmodus. Keine Ahnung, was der effektiv anstellt, denn da lief es bei mir auch noch... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 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