![]() |
DLL neu starten nach beenden
Ich habe eine Vis geschrieben mit 3 Modulen
Winamp stellt die möglichkeit zur verfügung die Module über einen Button vor, zurück oder zufällig zu starten. Mein problem ist nur wenn ich ein Modul beendet habe kann ich kein neues innerhalb der DLL auswählen weil sich diese dadurch beendet. Ich muss quasi die Module1_Quit aufrufen zum beenden
Delphi-Quellcode:
um danach das neue mit
procedure _Cover_Quit(This_Mod: PWinAMPVisModule); cdecl;
Module1_Init zu aktivieren. Nur wie stelle ich das an wenn die DLL dadurch beendet wird? In einer Anwendung kann ich ja unterbinden das sie doppelt gestartet wird
Delphi-Quellcode:
Gibt es sowas ähnliches damit sich meine DLL selbst wieder aufruft bzw.. gar nicht erst beendet?
initialization
hMutex := CreateMutex(nil, True, 'Global\Soundmachine'); if GetLastError = ERROR_ALREADY_EXISTS then Halt; finalization if hMutex <> 0 then CloseHandle(hMutex) Ich hoffe ihr versteht was ich damit meine. gruss |
AW: DLL neu starten nach beenden
Meines Wissens geht das nicht. Wenn WinAmp FreeLibrary aufruft gibt es nichts das deine DLL dagegen machen kann. Aber du kannst durchaus experimentieren. Der folgende Code erlaubt es dir beim Laden bzw. Entladen der DLL code auszuführen (am Ende der DLL einfügen):
Delphi-Quellcode:
Die Prozeduren Load und Unload musst du natürlich noch implementieren.
procedure DLLEntryPoint(Reason: Integer);
begin case Reason of DLL_PROCESS_ATTACH: Load; // wird ausgeführt beim laden der DLL DLL_PROCESS_DETACH: Unload; // wird ausgeführt beim entladen der DLL end; end; begin DllProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end. |
AW: DLL neu starten nach beenden
Zitat:
Delphi-Quellcode:
Ich wüßte jetzt nicht was du denkst das ich bei Load verwenden könnte.
function winampVisGetHeader: PWinAMPVisHeader; cdecl;
begin result := @VisHeader; end; exports winampVisGetHeader; begin gruss |
AW: DLL neu starten nach beenden
Das funktioniert bei jeder DLL, nicht bloss bei WinAmp. Damit kann man einfach code beim laden oder entladen der DLL ausführen. Ich wüsste allerdings nicht wie man das entladen abbrechen könnte. Du könntest vielleicht versuchen beim Unload eine Exception zu werfen, aber ich hab keine Ahnung wie das System bzw. WinAmp darauf reagiert.
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). Aber möglicherweise verstehe ich die Problematik auch nicht ganz. Was genau heisst "Vis mit 3 Modulen"? Ich meine ich kenne Winamp und ich habe auch schon mit den Visualisierungen herumgespielt (als Anwender nicht als Programmierer), aber irgendwie verstehe ich nicht ganz was du versuchst zu erreichen. Das umschalten der Module macht doch WinAmp, warum möchtest du da reinfummeln? |
AW: DLL neu starten nach beenden
Zitat:
die Module bzw.. Presets vor ,zurück und als Random auszuführen. Ich denke mal nicht das ich da rumfummel wenn die API von Winamp dafür zur verfügung gestellt wird. Diese Funktion von Winamp habe ich ja schon in meinem wrapper umgesetzt jetzt möchte ich natürlich auch mein eigenes Plugin den gegebenheiten anpassen was nur logisch ist. Ok wenn es nicht machbar ist werde ich die Module wohl zusammenführen müssen und diese innerhalb eines Moduls ausführen. gruss Emil Siehe Button unter dem VisWindow im Anhang(Bild) |
AW: DLL neu starten nach beenden
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. Zitat:
Zitat:
Zitat:
|
AW: DLL neu starten nach beenden
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: DLL neu starten nach beenden
Zitat:
Zitat:
|
AW: DLL neu starten nach beenden
Malen ist einfach: Ich kenne das nicht genau bei WinAmp, aber ich habe bei meinem eigen Projekt folgendes festestellt:
Mein Projekt lädt die Plugin-DLLs und ruft dort eine Init-Funktion auf, die mir ein Interface zurückliefert mit dem ich dann auf die DLL-funktinen zugreifen kann. In dieser Init-Funktion werden Klassen registriert, ganz einfach in einer Sortierten StringListe (ist eine Globale Variable - ich weiss dass das nicht toll ist, geht aber nicht anders). Wenn nun die DLL nicht sauber entladen wird, schlägt das Ausführen der Init-Funktion beim nächsten mal fehl, weil die entsprechenden Klassen schon einmal registriert wurden. Solche Szenarien sind durchaus auch bei WinAmp oder ähnlichen Problemstellungen denkbar... |
AW: DLL neu starten nach beenden
Zitat:
Aber hast schon recht, so ein Szenario würde ggf. fehlschlagen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz