Ich habe mein unmittelbares Problem zur Hand gelöst, aber jetzt muss ich verstehen, warum es gelöst ist. ;-)DLL Entlastungsprozedur
Also hier habe ich noch ein paar Fragen.
Angenommen, ich habe eine Klasse, die aus der DLL exportiert wird. Nun sollte diese DLL in den Speicher geladen werden, jedes Mal wenn ich rufen:
MyExportedClass *pb = new MyExportedClass;
und es sollte in Erinnerung bleiben und wird nur entladen, wenn ich rufe:
delete pb;
Ist das richtig?
Wenn verstehe ich das richtig und die Antwort auf die vorherige Frage ist ja, was dann in dem folgende Szenario passieren soll:
Ich habe eine Schnittstelle, die von der DLL exportierte (DLL1) und ich habe deren Umsetzung der wird von einer anderen DLL (dll2) exportiert. Also jedes Mal, wenn ich ausführen:
MyInterface *pInterface = new MyImplementation;
diese beiden DLLs sollten in dem Speicher geladen werden, und sie sollten in Erinnerung bleiben, bis ich rufe:
delete pInterface;
Ist das richtig?
Nun, wenn die Antwort auf diese Frage ja ist - habe ich eine Kontrolle/Spruch, welche Bibliothek wird zuerst entladen und welche wird die zweite sein? Oder das Entladen geschieht immer direkt nach dem Aufruf des Destruktors der entsprechenden Klasse?
Gibt es jetzt ein Tool, das prüft, ob die Bibliothek entladen wird und an welchem Punkt? Ich kann wahrscheinlich einfach die gefälschte DllMain() und überprüfen Sie ihre Prozess_Detach Fall, aber mein Eindruck war immer: Verwenden Sie DllMain, wenn die Bibliothek exportiert Funktion und nicht DllMain verwenden, wenn die Bibliothek Klassen exportiert. Ich habe diesen Ansatz seit MSVC 5/6 verwendet (nach einem der Bücher über C++).
War ich falsch, und ich kann immer DLLMain in beiden Fällen verwenden?
Vielen Dank.
Warum glauben Sie, dass jede Instantiierung/Zerstörung eines Objekts das gleiche für die gesamte DLL tut? – deviantfan
Mein Verständnis von Betriebssystemen sagt, dass eine DLL nur aus dem Speicher entladen wird, wenn der Speicher benötigt wird (durch eine andere DLL, ein Programm usw.). Durch das Löschen eines Objekts wird das Entladen einer DLL nicht erzwungen. –
@deviantfan, nicht sicher, was du meinst. Könnten Sie bitte erläutern? – Igor