AGB  ·  Datenschutz  ·  Impressum  







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

mehrere Formular-DLL laden/entladen

Ein Thema von Memo · begonnen am 12. Mär 2013 · letzter Beitrag vom 13. Mär 2013
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Memo
Memo

Registriert seit: 19. Aug 2003
509 Beiträge
 
Delphi 7 Enterprise
 
#1

mehrere Formular-DLL laden/entladen

  Alt 12. Mär 2013, 11:14
Delphi-Version: 7
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?

Geändert von Memo (12. Mär 2013 um 12:04 Uhr) Grund: Code gerade gerückt
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: mehrere Formular-DLL laden/entladen

  Alt 12. Mär 2013, 12:59
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 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...
  Mit Zitat antworten Zitat
Benutzerbild von Memo
Memo

Registriert seit: 19. Aug 2003
509 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: mehrere Formular-DLL laden/entladen

  Alt 12. Mär 2013, 14:06
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.
  Mit Zitat antworten Zitat
peterlepan

Registriert seit: 5. Jun 2006
Ort: Nordhausen
37 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: mehrere Formular-DLL laden/entladen

  Alt 12. Mär 2013, 17:34
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.
Peter Tabatt
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: mehrere Formular-DLL laden/entladen

  Alt 12. Mär 2013, 18:30
Mir ist es immer noch zu gruselig, direkt dahinter ein FreeLibrary . Was gibt der Aufruf denn zurück?
  Mit Zitat antworten Zitat
Benutzerbild von Memo
Memo

Registriert seit: 19. Aug 2003
509 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: mehrere Formular-DLL laden/entladen

  Alt 13. Mär 2013, 08:12
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.
  Mit Zitat antworten Zitat
peterlepan

Registriert seit: 5. Jun 2006
Ort: Nordhausen
37 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: mehrere Formular-DLL laden/entladen

  Alt 13. Mär 2013, 08:27
Hast Du die Formular mal einzeln ausprobiert? Und wie sieht die FormAnzeigen-Methode in der DLL genau aus?
Peter Tabatt
  Mit Zitat antworten Zitat
Benutzerbild von Memo
Memo

Registriert seit: 19. Aug 2003
509 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: mehrere Formular-DLL laden/entladen

  Alt 13. Mär 2013, 09:00
Ich habe mal ein Testprojekt angehängt.
Angehängte Dateien
Dateityp: zip TestFormDLL.zip (798,0 KB, 11x aufgerufen)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: mehrere Formular-DLL laden/entladen

  Alt 13. Mär 2013, 09:37
Ich habe (bislang) nicht verstanden, wozu das 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 TForm.Create() erzeugen und anschließend anzeigen
  2. Mehr nicht - Die Methode ist hier zuende.
  3. In der Hauptanwendung nicht gleich direkt mit FreeLibrary die dll wieder rauswerfen

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



PS:

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 FreeLibrary

Geändert von Der schöne Günther (13. Mär 2013 um 09:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Memo
Memo

Registriert seit: 19. Aug 2003
509 Beiträge
 
Delphi 7 Enterprise
 
#10

AW: mehrere Formular-DLL laden/entladen

  Alt 13. Mär 2013, 10:37
In der Dll die Form mittels 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 TForm.Create() reicht ja nicht.
  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 11:15 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