AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DefaultHandler beendet nicht

Ein Thema von EWeiss · begonnen am 3. Jan 2008 · letzter Beitrag vom 4. Jan 2008
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

DefaultHandler beendet nicht

  Alt 3. Jan 2008, 19:39
Irgendwie beendet bei mir der DefaultHandler nicht
obwohl ein close und free vorher aufgerufen wurde

woran kann es liegen ?

gruss Emil
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: DefaultHandler beendet nicht

  Alt 3. Jan 2008, 20:07
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?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

Re: DefaultHandler beendet nicht

  Alt 3. Jan 2008, 20:25
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
  Mit Zitat antworten Zitat
3. Jan 2008, 20:27
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Das ist eine Delphi-Frage.
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: DefaultHandler beendet nicht

  Alt 3. Jan 2008, 20:42
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).
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

Re: DefaultHandler beendet nicht

  Alt 3. Jan 2008, 20:59
ja war ein großer Fehler habe es korrigiert .. Dake

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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: DefaultHandler beendet nicht

  Alt 3. Jan 2008, 21:16
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?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

Re: DefaultHandler beendet nicht

  Alt 3. Jan 2008, 21:33
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
PostQuitMessage(0) im FormClose ereignis bringt nichts auch
SendMessage(ews^.me, WM_QUIT, 0, 0); führt zu keinen erfolg.

gruss Emil
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

Re: DefaultHandler beendet nicht

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

trotzdem Danke.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:50 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