Einzelnen Beitrag anzeigen

Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#6

AW: DLL neu starten nach beenden

  Alt 4. Nov 2010, 03:03
Das funktioniert bei jeder DLL, nicht bloss bei WinAmp. Damit kann man einfach code beim laden oder entladen der DLL ausführen.
Sorry, aber ich muß mich hier nochmal klugscheißerisch betätigen.

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.

Ich wüsste allerdings nicht wie man das entladen abbrechen könnte.
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 ...

Du könntest vielleicht versuchen beim Unload eine Exception zu werfen, aber ich hab keine Ahnung wie das System bzw. WinAmp darauf reagiert.
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!

Und das mit dem selbst wieder aufrufen... ich glaube nicht das das aus der DLL aus geht - im Gegenteil, die Gefahr besteht, dass sich die DLL rekursiv immer wieder lädt bis dem System die Ressourcen ausgehen (Stackoverflow oder noch schlimmeres).
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.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat