Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   DefaultHandler beendet nicht (https://www.delphipraxis.net/106004-defaulthandler-beendet-nicht.html)

EWeiss 3. Jan 2008 18:39


DefaultHandler beendet nicht
 
Irgendwie beendet bei mir der DefaultHandler nicht
obwohl ein close und free vorher aufgerufen wurde

woran kann es liegen ?

gruss Emil

Muetze1 3. Jan 2008 19:07

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?

EWeiss 3. Jan 2008 19:25

Re: DefaultHandler beendet nicht
 
Ja sorry

Delphi-Quellcode:
type
  TVisForm = class(TForm)
...
  public
    procedure DefaultHandler(var Message); override;
end
Delphi-Quellcode:
procedure Module1_Quit(This_Mod: PWinAMPVisModule);
begin

  SetWindowLong(ews^.me, GWL_WNDPROC, 0);

  VisForm.Timer1.Enabled := False;
  VisForm.Close;
  VisForm.Free;
Bei Quit rufe ich ordnungsgemäß close, free auf aber der handler läuft weiter
SetWindowLong beendet die Proc welche vorher mit
Delphi-Quellcode:
  if MainWindowProc = nil then
    MainWindowProc := Pointer(SetWindowLong(ews^.me, GWL_WNDPROC,
                              longint(@VisProc)));
initialisiert wurde..

Das ganze läuft in einer DLl

gruss Emil

DP-Maintenance 3. Jan 2008 19:27

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Das ist eine Delphi-Frage.

Muetze1 3. Jan 2008 19:42

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).

EWeiss 3. Jan 2008 19:59

Re: DefaultHandler beendet nicht
 
ja war ein großer Fehler habe es korrigiert .. Dake

Delphi-Quellcode:
SetWindowLong(ews^.me, GWL_WNDPROC, LongInt(MainWindowProc));
Die DLL beendet jetzt allerdings nur wenn ich die Konfig vorher nicht aufgerufen habe welche eine
neue Form im Projekt darstellt.

Ist mir unverständlich warum das schließen dieser mit einer AV quittiert wird.

Delphi-Quellcode:
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;
Diese wird Modal aufgerufen und wenn geschlossen wieder frei gegeben.

Solange wie ich diese nicht aufrufe funktioniert alles
wird sie aufgerufen und die DLL beenden
Delphi-Quellcode:
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;
gibt es den AV

gruss Emil

Muetze1 3. Jan 2008 20:16

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?

EWeiss 3. Jan 2008 20:33

Re: DefaultHandler beendet nicht
 
Zitat:

Zitat von Muetze1
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?

Das habe ich schon versucht die Config form nach Free auf Nil zu setzen
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:
PostQuitMessage(0)
im FormClose ereignis bringt nichts auch
Delphi-Quellcode:
SendMessage(ews^.me, WM_QUIT, 0, 0);
führt zu keinen erfolg.

gruss Emil

EWeiss 4. Jan 2008 00:20

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:
PostMessage(ews^.me, WM_DESTROY, 0, 0);
Ein WM_CLOSE oder WM_QUIT wird nicht aktzeptiert.

trotzdem Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz