AGB  ·  Datenschutz  ·  Impressum  







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

Forms in einer DLL erzeugen - die Theorie

Ein Thema von sieppl · begonnen am 21. Sep 2005 · letzter Beitrag vom 23. Sep 2005
Antwort Antwort
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#1

Forms in einer DLL erzeugen - die Theorie

  Alt 21. Sep 2005, 10:39
Hi!

Ich möchte kurz die Theorie der Erzeugung von Forms in DLL beleuchten:

Warum führt es zu Problemen in einer DLL eine Form ganz normal mit SHow zu erzeugen? Mir wurde gesagt, dass DLLs keine eigene Nachrichtenschleife haben, was auch logisch ist. Sie benutzen die Nachrichtenschleife der aufrufenden Applikation. Damit wäre dann auch die Nachrichtenschleife von TApplication ausgehebelt. Was es dann sehr schwierig macht eine bestehende Anwendung in eine DLL einzubetten.

Was passiert wenn eine DLL eine Form modal anzeigt?

Ich möchte ein kleines PlugIn für ACDSee schreiben und eine bestehende Applikation zum Verwalten von Fotos einbinden.
In dieser Applikation befinden sich natürlich zahlreiche Application.ProcessMessages und zig andere Referenzen auf TApplication. Ich stehe nun wie eine Ochse im Wald und weiß nicht, welche Konsequenzen mein Vorhaben mit sich bringen wird.
Könnte ich die App zu umschreiben, dass sie brav in einem modalen Fenster läuft? (Inkl. Threads)

Grüße

Sebastian
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

Registriert seit: 10. Sep 2003
Ort: Großhennersdorf
532 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: Forms in einer DLL erzeugen - die Theorie

  Alt 21. Sep 2005, 11:28
bei ShowModal hält der jeweilige Thread an... Wenn du also die Dll nicht in einem Extra Thread laufen lässt, bleibt das Hauptprogramm stehen.
Marco Warm
TUO
TheUnknownOnes.net
  Mit Zitat antworten Zitat
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#3

Re: Forms in einer DLL erzeugen - die Theorie

  Alt 22. Sep 2005, 20:34
Ich habe das Problem, dass ich zwar eine Form erzeugen kann und diese modal anzeige, wenn ich in auf dieser andere Frames einbinden möchte, scheitern die Aufrufe mit 'kein übergeordnetes Fenster'. Dies liegt daran, dass der Application.Handle = 0 ist.
Hat denn niemand Erfahrung, was in einer DLL möglich ist und wie man stabil mit Delphi eine Form erzeugt, die alle Möglichkeiten einer 'vollwertigen' Applikation bietet?
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#4

Re: Forms in einer DLL erzeugen - die Theorie

  Alt 22. Sep 2005, 22:12
hier habe ich mist geschrieben - gelöscht -
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

Registriert seit: 10. Sep 2003
Ort: Großhennersdorf
532 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

Re: Forms in einer DLL erzeugen - die Theorie

  Alt 23. Sep 2005, 06:22
also das ist alles Möglich...
Es ist so, daß es generell nicht empfohlen wird VCL-Formulare in DLLs auszulagern, da das viel Speicher fressen soll, weil die VCL mehrfach geladen werden muss. Ich mach es trotzdem und die Programme laufen auch Anstandslos. Der offizielle Weg ist, bpl's zu benutzen. Das hab ich auch schon versucht, aber da ärgert man sich nur rum und muss dem Endkunden auch die ganzen System-BPLs von Borland mitliefern (nich so schön)

Auf alle Fälle solltest du der DLL beim Aufruf das ApplicationHandle übergeben.

wenn du willst kann ich dir ja ein bissl Beispielcode posten.
Marco Warm
TUO
TheUnknownOnes.net
  Mit Zitat antworten Zitat
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#6

Re: Forms in einer DLL erzeugen - die Theorie

  Alt 23. Sep 2005, 08:42
Zitat von MarcoWarm:
also das ist alles Möglich...
Es ist so, daß es generell nicht empfohlen wird VCL-Formulare in DLLs auszulagern, da das viel Speicher fressen soll, weil die VCL mehrfach geladen werden muss. Ich mach es trotzdem und die Programme laufen auch Anstandslos. Der offizielle Weg ist, bpl's zu benutzen. Das hab ich auch schon versucht, aber da ärgert man sich nur rum und muss dem Endkunden auch die ganzen System-BPLs von Borland mitliefern (nich so schön)

Auf alle Fälle solltest du der DLL beim Aufruf das ApplicationHandle übergeben.

wenn du willst kann ich dir ja ein bissl Beispielcode posten.
BPL ist nicht nötig. Das PlugIn (als DLL) wird ausschließlich für ACDSee benutzt werden. Also werden Formulare nur einmal geladen.
Mein Problem: Falls während der Erstellungsphase eines Frames eine Message an den Handle des Frames gepostet werden soll gibt es die Fehlermeldung 'kein übergeordnetes Fenster'. Weil der Owner in diesem Moment noch kein Handle besitzt wird auf den Handle der Application zurückgegriffen. Dieses ist aber Null wenn die Form von einer DLL erzeugt wird. Ich habe schon versucht dem Application. Handle der globalen Instanz innerhalb meiner DLL den Handle der aufrufenden Application zuzuweisen. Probeweise Application.Handle einer DummyHost.exe die ich mir fix zusammengeschraubt habe, aber auch den Handle einer TestForm der DummyHost.exe. Beides führt zu Zugriffsverletzungen. Ich kann aber gerne nochmal die genauen Resultate posten, bei beiden Versuchen.
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#7

Re: Forms in einer DLL erzeugen - die Theorie

  Alt 23. Sep 2005, 10:19
Tja, so geht es los, die ständigen Probleme mit "Forms in DLLs".

Technisch gesehen kann die VCL solche Sachen nicht unterstützen, d.h. jedweige Lösung des Problems über die VCL muß in schlechten Tricksereien ausarten.
Die einzigst saubere Lösung wäre es auf die VCL zu verzichten und reines native Windows API zu benutzen, da die Windos-Fensterhandles sehr wohl über DLL's erzeugt werden können.

Möchte man die VCL denoch benutzen so gibt es nur eine saubere Lösung:

1.) beim Aufruf der DLL Funktion die ein TForm erzeugt muß der Aufrufer ein ParentWindowHandle: hWnd mit übergeben.
2.) der Aufrufer erzeugt seinerseits ein TForm als Container und übergibt dessen Handle der DLL als ParentWindowHandle.
3.) die DLL Funktion die nun das TForm erzeugt muß Form.ParentWindowHandle := ParanWindowHandle setzen. Das So erzeugte TForm muß ohne Caption, Border und alClient erzeugt werden. Somit ist dieses TForm inplaced eingebettet in den TForm Container der Hauptanwendung. Dieser TForm Container kann auch ein MDI Child sein.
4.) die Hauptanwendung muß ihrerseits einige Änderungen am VCL Code vornehmen, sprich an den Original Sourcen der VCL. Hauptsächlich müssen nur 2-3 Methoden geändert werden in denen per IS und AS Operatoren in der Fokusierung eines Controls dessen Klassentyp abgefragt wird. Diese IS und AS Sourcestücken müssen dürch Class.ClassNameIs() umgebaut werden. Statt also mit IS und AS direkt den Klassenzeiger zu vergleichen muß man alles so umbauen das die Klassennamen verglichen werden.

Dann und nur dann kann man davon ausgehen das dieses System zu 99% stabil funktioniert.

Gruß Hagen
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:12 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