2013-02-01 13 views
5

Ist es möglich, Fehler innerhalb WindowProc Rückruf zu fangen? try/catch funktioniert nicht. Sieht aus wie __try__except und auch Hardware-Ausnahme (AV, zum Beispiel) funktioniert auch nicht.Ausnahme in WindowProc


Update:

ich, dass in der Tat herausgefunden dies möglich ist, außer in WindowProc Rückruf zu werfen und es mit catch Block außerhalb WindowProc zu fangen. Getestet und funktioniert unter Windows XP x86. Ich fand releated Frage 64bit exceptions in WndProc silently fail Das Problem scheint nur auf Windows 7 x64 (und entsprechend dieser Frage auf anderen x64 Windows-Versionen zu existieren).

Also die Frage ist es irgendwie möglich, Ausnahme in WindowProc zu werfen und es mit catch Block außerhalb WindowProc zu fangen? Ich installierte Microsoft Hotfix, setzen DisableUserModeCallbackFilter auf 1 in der Registrierung und am besten bekomme ich FATAL_USER_CALLBACK_EXCEPTION, nicht meine Ausnahme.

+0

WinAPI-Funktionen verwenden keine Ausnahmen. Sie wurden in C geschrieben. – chris

+0

Ist es möglich, Fehler innerhalb von WindowProc Callback ohne Ausnahmen zu bestimmen? – Demion

+0

Sicher, rufen Sie die Funktionen von dort, überprüfen Sie auf Fehler, und verwenden Sie "GetLastError" und dergleichen entsprechend. Verteilen Sie Ergebnisse, wenn Sie von einer Funktion aufrufen, die in 'WindowProc 'aufgerufen wird. – chris

Antwort

4

Die MSDN documentation for WindowProc enthält detaillierte Informationen zu Ausnahmen, die von WindowProc ausgelöst/propagiert werden. Es scheint, dass Ausnahmen nur in 32-Bit-Versionen von Windows weitergegeben werden.

Ihre ursprüngliche Frage unterscheidet sich jedoch von der Frage in Ihrem Update. Die erste war ungefähr , die Ausnahmen in WindowProc fängt, und das wird immer gut funktionieren. Die zweite ist etwa werfen Ausnahmen von WindowProc.

Ich bin mir nicht sicher über die Nützlichkeit/Notwendigkeit der zweiten. Eine Fensterprozedur wird normalerweise aufgerufen als Ergebnis von:

  1. DispatchMessage in der Nachrichtenschleife aufrufen. In diesem Fall muss keine Ausnahme ausgelöst werden, da andernfalls die Anwendung beendet wird. Wenn ein Fehler auftritt, der dazu führen sollte, dass die Anwendung beendet wird, rufen Sie einfach PostQuitMessage (0)
  2. Aufruf von SendMessage auf. In diesem Fall möchten Sie keine Ausnahmen auslösen, da die Fensterprozedur im UInthread ausgeführt wird. Wenn sich der aufrufende Thread vom UInthread unterscheidet, ruft der aufrufende Thread die Ausnahme trotzdem nicht
  3. Aufruf ab die Fensterprozedur direkt. Ausnahmen funktionieren in diesem Fall gut.
+1

Ich möchte eine Ausnahme auslösen, wenn die Fensterprozedur als Ergebnis des Aufrufs von DispatchMessage aufgerufen wird. Ich weiß, dass dies möglich ist, PostQuitMessage (0); oder benutze globale Variablen, um einen Fehler anzuzeigen, aber ich möchte Ausnahmen verwenden, um mehr Informationen über Fehler wie Fehlercode, Zeilennummer in WindowProc usw. zu liefern. Also meine Frage ist es sogar möglich, Ausnahme von WindowProc auf x64-Version zu werfen? Vielleicht ist es möglich, es mit __try __except zu machen? – Demion

+0

Wenn die MSDN-Verbindung korrekt ist und ich sie richtig lese, ist das nicht möglich. Dennoch, warum nicht einfach alle Fehlermeldungen direkt in WindowProc ausführen und dann PostQuitMessage (0) aufrufen? – user1610015

+0

Weil es ungünstig ist, Fehler an zwei verschiedenen Stellen zu behandeln, eine in WindowProc und andere im catch-Block.Ich denke, dass einer der Ausnahme-Vorteil ist, dass Sie alle Fehler an einem Ort behandeln können. Aber das ist nicht wirklich irrelevant zu hinterfragen. Jedenfalls danke für die Antwort. – Demion