Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi mehrere Formular-DLL laden/entladen (https://www.delphipraxis.net/173712-mehrere-formular-dll-laden-entladen.html)

Memo 12. Mär 2013 10:14

Delphi-Version: 7

mehrere Formular-DLL laden/entladen
 
Hallo,

ich habe ein kleines Demo-Projekt mit Luckies Code http://www.michael-puff.de/Programmi...ormInDLL.shtml zusammengestellt um das Problem zu erklären.
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:
{-----------------------------------------------------------------------------
 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;
Weiß jemand Rat?

Der schöne Günther 12. Mär 2013 11:59

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...

Memo 12. Mär 2013 13:06

AW: mehrere Formular-DLL laden/entladen
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1207081)
Was ist, wenn man das auf "später" vertagt, ändert das etwas?

Nein.
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.

peterlepan 12. Mär 2013 16:34

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.

Der schöne Günther 12. Mär 2013 17:30

AW: mehrere Formular-DLL laden/entladen
 
Mir ist es immer noch zu gruselig, direkt dahinter ein
Delphi-Quellcode:
FreeLibrary
. Was gibt der Aufruf denn zurück?

Memo 13. Mär 2013 07:12

AW: mehrere Formular-DLL laden/entladen
 
Zitat:

Zitat von peterlepan (Beitrag 1207117)
probier mal die beiden mit ShowForm1 und ShowForm2 zu bezeichnen.

Hat leider nicht gewirkt.

Zitat:

Mir ist es immer noch zu gruselig, direkt dahinter ein FreeLibrary..
Das hat mit der Problematik nichts zu tun und ist kein Fehler.
Zitat:

Was gibt der Aufruf denn zurück? .
Es wird eine Formular-Dll erzeugt, es wird nichts zurückgegeben.

peterlepan 13. Mär 2013 07:27

AW: mehrere Formular-DLL laden/entladen
 
Hast Du die Formular mal einzeln ausprobiert? Und wie sieht die FormAnzeigen-Methode in der DLL genau aus?

Memo 13. Mär 2013 08:00

AW: mehrere Formular-DLL laden/entladen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal ein Testprojekt angehängt.

Der schöne Günther 13. Mär 2013 08:37

AW: mehrere Formular-DLL laden/entladen
 
Ich habe (bislang) nicht verstanden, wozu das
Delphi-Quellcode:
Application
-Objekt eigentlich gut ist. Deshalb habe ich es in deinem Testprojekt einmal so abgeändert, wie ich es bei mir tue:
  1. In der Dll die Form mittels
    Delphi-Quellcode:
    TForm.Create()
    erzeugen und anschließend anzeigen
  2. Mehr nicht - Die Methode ist hier zuende.
  3. In der Hauptanwendung nicht gleich direkt mit
    Delphi-Quellcode:
    FreeLibrary
    die dll wieder rauswerfen

Und es geht - Die Fenster werden so geschlossen, wie man auch draufklickt.



PS:

Zitat:

Zitat von Memo (Beitrag 1207174)
Zitat:

Was gibt der Aufruf denn zurück? .
Es wird eine Formular-Dll erzeugt, es wird nichts zurückgegeben.

Damit meinte ich den Rückgabewert von
Delphi-Quellcode:
FreeLibrary

Memo 13. Mär 2013 09:37

AW: mehrere Formular-DLL laden/entladen
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1207189)
In der Dll die Form mittels
Delphi-Quellcode:
TForm.Create()
erzeugen und anschließend anzeigen
Und es geht - Die Fenster werden so geschlossen, wie man auch draufklickt.

Kannst Du mal ein dpr-File einer DLL zeigen? Einfach nur
Delphi-Quellcode:
TForm.Create()
reicht ja nicht.


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