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.