![]() |
DefaultHandler beendet nicht
Irgendwie beendet bei mir der DefaultHandler nicht
obwohl ein close und free vorher aufgerufen wurde woran kann es liegen ? gruss Emil |
Re: DefaultHandler beendet nicht
Kannst du einem vllt. ein wenig mehr von dem Rahmen erzählen? Was ist der Defaulthandler bzw. anders gefragt: In welchem Teil des Delphi-Kosmos befindest du dich gerade? Free und Close von was?
|
Re: DefaultHandler beendet nicht
Ja sorry
Delphi-Quellcode:
type
TVisForm = class(TForm) ... public procedure DefaultHandler(var Message); override; end
Delphi-Quellcode:
Bei Quit rufe ich ordnungsgemäß close, free auf aber der handler läuft weiter
procedure Module1_Quit(This_Mod: PWinAMPVisModule);
begin SetWindowLong(ews^.me, GWL_WNDPROC, 0); VisForm.Timer1.Enabled := False; VisForm.Close; VisForm.Free; SetWindowLong beendet die Proc welche vorher mit
Delphi-Quellcode:
initialisiert wurde..
if MainWindowProc = nil then
MainWindowProc := Pointer(SetWindowLong(ews^.me, GWL_WNDPROC, longint(@VisProc))); Das ganze läuft in einer DLl gruss Emil |
DP-Maintenance
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Das ist eine Delphi-Frage. |
Re: DefaultHandler beendet nicht
Wieso setzt du die WNDPROC auf 0? Wenn du diese subclassen willst, dann hast du die alte WNDPROC mit GetWindowLong() zu ermitteln und abzulegen. Danach die neue setzen. Alle Botschaften die du in der neuen nicht verarbeitest, gibst du an die alte WNDPROC weiter (die du gesichert hast) mit der Funktion CallWindowProc(). Wenn du im Quit das SubClassing wieder entfernen möchtest, dann setze die WNDPROC wieder auf den alten ermittelten Wert, also die alte WNDPROC.
Und der DefaultHandler wird doch so oder so aufgerufen, schon allein da die Methoden Close etc viele Botschaften direkt einspeisen, sprich entweder direkt die WndProc aufrufen oder per Perform() diese direkt in ihre Nachrichtenverarbeitung einspeisen. Und die Basis WndProc() ruft bei bisher unbehandelten Botschaften nunmal den DefaultHandler() auf - und das sind recht viele. Selbst wenn du diesen nicht sub-classed, werden trotzdem noch Botschaften an das Fenster und somit auch das die WndProc gesendet. Und mal abgesehen davon, dass Close und andere Methoden nicht über die WinAPI einspeisen sondern mit Perform direkt die WndProc anspringen (und somit dein SubClassing gar keine Auswirkungen hat). |
Re: DefaultHandler beendet nicht
ja war ein großer Fehler habe es korrigiert .. Dake
Delphi-Quellcode:
Die DLL beendet jetzt allerdings nur wenn ich die Konfig vorher nicht aufgerufen habe welche eine
SetWindowLong(ews^.me, GWL_WNDPROC, LongInt(MainWindowProc));
neue Form im Projekt darstellt. Ist mir unverständlich warum das schließen dieser mit einer AV quittiert wird.
Delphi-Quellcode:
Diese wird Modal aufgerufen und wenn geschlossen wieder frei gegeben.
procedure Module1_Config(This_mod: PWinAMPVisModule); cdecl;
begin if (not ConfigVisible) then begin Form1 := TForm1.Create(nil); try begin ConfigVisible := True; if assigned(VisForm) then VisForm.Timer1.Enabled:=false; Form1.ShowModal; end; finally begin Form1.Free; ConfigVisible := False; end; end; end; end; Solange wie ich diese nicht aufrufe funktioniert alles wird sie aufgerufen und die DLL beenden
Delphi-Quellcode:
gibt es den AV
procedure Module1_Quit(This_Mod: PWinAMPVisModule);
begin SetWindowLong(ews^.me, GWL_WNDPROC, integer(MainWindowProc)); VisForm.Timer1.Enabled := False; VisForm.Close; VisForm.Free; Form1.free; <--- if waver >= $2901 then begin SendMessage(this_mod^.hWNDParent, WM_WA_IPC, 0, IPC_SETVISWND); DestroyWindow(ews^.me); GlobalFree(HGLOBAL(ews)); end; end; gruss Emil |
Re: DefaultHandler beendet nicht
Du rufst an zwei Stellen Form1.Free auf, ohne das Formular auch nil zu setzen? Dadurch wird beim zweiten Aufruf eine AV ausgelöst, da die Variable noch was ungleich nil enthält. Oder habe ich das nur falsch verstanden?
|
Re: DefaultHandler beendet nicht
Zitat:
wenn ich das mache schließt die DLL überhaupt nicht. Keine ahnung wo es noch dran liegen könnte Wenn die VisForm geschlossen wird sende ich eine
Delphi-Quellcode:
im FormClose ereignis bringt nichts auch
PostQuitMessage(0)
Delphi-Quellcode:
führt zu keinen erfolg.
SendMessage(ews^.me, WM_QUIT, 0, 0);
gruss Emil |
Re: DefaultHandler beendet nicht
Hat sich erledigt jetzt geht es.
Es lag nicht an den Formen ob sie freigegeben werden oder nicht. Habe lediglich eine Message nach außen vergessen zu senden dadurch konnte Winamp den Thread nicht beenden und das Plugin sich selbst logicherweise auch nicht. Das wars
Delphi-Quellcode:
Ein WM_CLOSE oder WM_QUIT wird nicht aktzeptiert.
PostMessage(ews^.me, WM_DESTROY, 0, 0);
trotzdem Danke. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:48 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