Einzelnen Beitrag anzeigen

ele

Registriert seit: 18. Feb 2009
129 Beiträge
 
Delphi 2010 Professional
 
#7

AW: DLL neu starten nach beenden

  Alt 4. Nov 2010, 14:48
Zitat:
Einfach ausführen ist Quark. Der Grund ist, daß in der DllMain grundsätzlich das Loader-Lock gehalten wird. Man kann also gewisse Sachen absolut nicht machen. Manche gehen eventuell gut (auch wenn nicht erlaubt), aber das ("dynamische") Laden einer anderen DLL ist bspw. tabu.
Da wiederspreche ich auch nicht.

Zitat:
Kann man nicht. Man kann es aber verhindern. DLLs haben im Speicher einen Referenzzähler. Gut, eigentlich haben sie ein Handle, welches ein darunterliegendes Kernelobjekt hat welches den Zähler hat ... Fällt der auf Null, wird die DLL endgültig entladen. Rein theoretisch könnte Code in deiner DLL einfach auf sich selber nochmal LoadLibrary() aufrufen (nur eben nicht in DllMain) ... damit hast du eine Referenz mehr als Winamp kennt. Entsprechend wird deine DLL nicht entladen werden (wenn wir annehmen, daß Winamp nicht einfach solange FreeLibrary aufruft bis deine DLL wirklich wech ist). Allerdings habe ich es nicht getestet, sondern es basiert auf dem Grundlagenwissen zu DLLs usw. und ich halte es für gangbar ...
Ja durchaus denkbar, dass es so funktioniert. Aber die Frage ist wie WinAmp wiederum darauf reagiert wenn eine DLL nicht sauber entladen wird bei einem FreeLibrary. Da kann ich mir allerlei Folgefehler ausmalen...

Zitat:
Scherz? Ganz schlechter, wenn es einer war. Denn Exceptions sind, insofern wir nicht von SEH reden, eine Compilerangelegenheit. Und man mag es kaum glauben, aber Winamp dürfte kaum eine Ahnung von Delphis Exceptions haben. Ja, mir ist bekannt, daß viele Compiler auf Windows SEH als Mechanismus für Sprach-Exceptions benutzen. Aber das berührt das vorgesagte nicht im Geringsten. Ich bin mir sogar relativ sicher, daß Winamp SEH-Exceptions abfängt (weil ich die Option zum Abschalten dieser Funktion gesehen habe), aber das kann auch schiefgehen. Grundsätzlich hat sich ein Plugin an die Regeln des ausführenden Programms zu halten!
Ich habe keine systemnahe Kenntnisse von Exceptions. Ich verwende die Dinger einfach und ich weiss dass das auch über die DLL-Grenze hinweg funktioniert. Wie das mit der Kompatibilität unter den einzelnen Programmiersprachen aussieht weiss ich nicht. Deshalb habe ich ja auch geschrieben, dass er es versuchen soll, wenn ich mir sicher gewsen wäre es funktioniert (oder eben nicht) hätte ich das auch so geschrieben.

Zitat:
Unsinn. Siehe oben. Da die DLL in Winamp ist und beim Laden einer weiteren Instanz von sich selbst exakt den selben Speicher belegt den sie ohnehin schon hat, kann man bspw. eine einfache Variable per Interlocked-Funktionen hochzählen lassen und bpsw. ab einem bestimmten Wert, ich sage mal 1 oder 2, nicht mehr LoadLibrary aufrufen.
Ja und was wenn man eben keine Variable hochzählt? Ich glaube die Auswirkungen auf das System könnten vo der übleren Sorte sein... Deshalb habe ich auch auf die Gefahr aufmerksam machen wollen. Ich sage nicht dass es nicht möglich ist, ich weiss dass man von einer DLL aus andere DLLs dynamisch laden kann (das man das nicht von DLLMain aus mahcen soll/kann sei mal dahingestellt). Aber man sollte auch entsprechend vorsichtig sein...
  Mit Zitat antworten Zitat