Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi DLL-Form mit show (https://www.delphipraxis.net/95699-dll-form-mit-show.html)

Mattze 11. Jul 2007 18:41


DLL-Form mit show
 
Hallo,

also ich weiß nicht, wo ich noch suchen könnte...

Ich rufe im Hauptprogramm eine Form aus einer DLL auf.
Showmodal - alles klar.
Aber "ohne modal", nur show?
Zuerst musste ich das stdcall von der "Anzeigeprocedure" wegmachen. Sonst kam eine Zugriffsschutzverletzung. Ohne funktioniert es aber problemlos.
(Der Fehler kam direkt im show. Createn konnte er noch alles ordentlich. Nach dem Fehler ging das show aber ganz normal und sauber weiter!)

Ich lade die DLL dynamisch. Wenn ich nun das Hauptprogramm beende, will ich natürlich auch die DLL ordentlich entladen.
Delphi-Quellcode:
If VHandle<>0 then freelibrary(VHandle);
Und das will er nicht. Fehler! Irgendein Read im ntdll.KiFastSystemCallRet will nicht und zwar gleich das Erste.
Wenn ich die DLL-Form aus dem Hauptprogramm freigebe, passiert das gleiche.
Wenn ich die DLL-Form in der DLL-Form schließe und danach das Hauptprogramm schließe, funktioniert es ordentlich.

Wer weiß, was man da machen kann?

Gruß
Mattze

DeddyH 11. Jul 2007 18:56

Re: DLL-Form mit show
 
AFAIK darfst Du Formulare, die aus DLLs aufgerufen werden, generell nur über ShowModal aufrufen (oder der Herr Kosch lügt oder weiß es nicht besser ;))

Mattze 11. Jul 2007 19:44

Re: DLL-Form mit show
 
hallo,

na ja, "darfst"?

Wie gesagt, es gibt absolut kein Problem (ohne stdcall)!
Die DLL-Form ist dann ordentlich bedienbar und auch das Hauptformular arbeitet gut.
(Mit windows.setparent kriegt man dann sogar fast MDI hin, wenn man kein Menumerging braucht. Heißt das eigentlich so?)
Wenn man die Bibliothek (sprich: den Handle) nicht wieder frei gibt (am Ende des Hauptprogramms), gibt es da auch keine Probleme mit dem Ende.
Wenn die DLL-Form aus der DLL-Form geschlossen wurde, gibt es auch mit dem Freigeben im Hauptprogramm keine Probleme.

Ergo: Ich sehe da momentan nicht richtig durch. Es geht und es geht auch nicht.

Gruß
Mattze

SirThornberry 11. Jul 2007 19:48

Re: DLL-Form mit show
 
stdcall ist nur notwendig wenn du die aufzurufende Funktion als Stdcall declarierst. Ich glaub du solltest dich über die Aufrufkonventionen und deren Verwendung mal schlauch machen. Und vor allem den Teil im DLL-Projekt ganz obe lesen und verstehen.

Mattze 12. Jul 2007 10:29

Re: DLL-Form mit show
 
Hallo SirThornberry,

bist Du mir böse oder warum "Thema verfehlt - 5"?
Es geht nicht um das Stdcall, wenn ich mal erinnern dürfte, sondern um das show (bzw. showmodal) einer DLL-Form und das missglückende Freigeben der Bibliothek am Ende des Hauptprogramms.

Ich programmiere nicht seit gestern und weiß (in der Regel) was ich machen kann und wie ich es machen muss. Das gilt auch für Aufrufkonventionen.

Gut, ich habe bisher keine DLLs programmiert, weil es einfach nicht notwendig war. Notwendig ist es jetzt zwar auch nicht, aber passend.
Und bevor ich mich mit irgendeinem neuen Thema befasse, lese ich alles mögliche, was ich dazu bekommen kann. Machst Du das anders? Und da steht auch einiges dazu drin, was Du empfiehlst - oder sollten das alle anderen vergessen haben?

Muss Deine tolle Antwort wirklich so beleidigend ausfallen? Ich gucke und probiere es fast immer aus und versuche SELBER ein Lösung zu finden, BEVOR ich frage.

Gruß
Mattze

Nuclear-Ping 12. Jul 2007 17:20

Re: DLL-Form mit show
 
Wie wurde die Form erstellt? Von dir mit Delphi? Wenn ja, dürfte das was für dich sein: http://delphi.about.com/b/a/257771.htm

Mattze 12. Jul 2007 18:38

Re: DLL-Form mit show
 
Hallo,

hab's eben rausbekommen.
Wie üblich habe ich an der völlig falschen Stelle gesucht. Die DLL-Form mit show geht einwandfrei!
Nur das windows.setparent spielt nicht mit.
Vor dem Schließen des Hauptprogrammes muss die parentform der DLL-Form wieder vom Handle der "Hauptform" gelöst werden (windows.setparent(DLL_Form.handle,0);). Das ist alles und dann geht es in Ordnung!

Ich gucke aber trotzdem noch zu Delphi.about. Danke!
Man kann ja nie wissen...

Gruß
Mattze

Nuclear-Ping 12. Jul 2007 18:41

Re: DLL-Form mit show
 
Hab auch ein Projekt gehabt, wo Forms per "Plugin-System" dynamisch in eine Anwendung eingebunden wurden. Das von dir geschilderte Problem hatte ich mit den Artikeln von delphi.about.com nie. ;) (Omg, das klingt ja wie Werbung :mrgreen:)

Mattze 12. Jul 2007 19:23

Re: DLL-Form mit show
 
Hallo,

den Artikel (und die anderen von delphi.about über DLLs) habe ich natürlich schon gelesen.
Aber das war eben etwas ganz spezielles. Es ist eigentlich logisch, dass setparent da abwinkt. Hätte ich auch früher drauf kommen können.
Aber im Nachhinein ist alles klar, logisch und soooo eindeutig!

Gruß
Mattze

PS: Übrigens habe ich jetzt das Problem, dass bei Unloadlibrary das Hauptprogramm (ohne Fehlermeldung) geschlossen wird. (Ein globales Atom aus dem Hauptprogramm bleibt erhalten!) Nun ja, die "Späße" reißen nicht ab...


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