Ahoi
Der Titel sagt schon Alles.
Wir haben hier eine Applikation, die per
DLL mit einer Steuerungsschnittstelle kommuniziert. Diese ist ziemlich tief im Windows-System verwoben, was sich durch den Umstand bemerkbar macht, das die Steuerungssoftware selbst dann weiterläuft, wenn Windows mit einem BSOD abschmiert oder sonst irgendwie abgeschmiert ist (was eigentlich nicht vorkommen darf, aber so stehts im Prospekt).
Nun denn, die Schnittstelle ist also eine
DLL, die statisch von Delphi geladen wird (durch die 'external' Direktive). Desweiteren laufen diverse Threads in der Anwendung. Anwender berichten nun, das diese Anwendung ab und zu beim Beenden nicht aus dem Speicher verschwindet, sie ist in der Prozessliste noch zu sehen und lässt sich durch den Taskmanager *nicht* abschießen.
Ich dachte zuerst an einen nicht terminierenden Thread, aber dann kann man die App doch abschießen, oder?
Blöderweise funktioniert ein Teil der Applikation immer noch, sodaß die Steuerungssoftware denkt, die App läuft, obwohl sie in Wirklichkeit vollkommen breit im Speicher rumgeistert und keinen Ton von sich gibt.
Meine Frage:
Kann das Hängen und vor allen Dingen das nicht-abschießen-können damit zu tun haben, das die Anwendung gerade in der
DLL ist, die widerum in den Tiefen von Windows rumrödelt? Lohnt es sich also, die
DLL dynamisch zu laden und bei Programmende kontrolliert zu einem bestimmten Zeitpunkt X selbst freizugeben, um diesen undeterministischen Zustand zu vermeiden? Ich würde den Aufruf der
DLL sogar über eine Critical Section kapseln oder irgendwie sicherstellen, das die
DLL nur dann entladen wird, wenn gerade kein Zugriff darauf stattfindet.
Bringt das was?