Ein altes Delphi-Projekt schluckt viele Exceptions oder lässt sie auf die
VCL durchbubbeln. Es soll nun so erweitert werden, dass diese Exceptions mit Callstack in eine Textdatei gelogged werden sollen.
Bis hierhin noch einfach. Jetzt das Problem: Das Projekt benutzt viele DLLs die ebenfalls in Delphi erstellt wurden. Es ist nicht garantiert dass alle von den DLLs exportierten Methoden keine Exceptions werfen. Die Aufruf-Direktive ist durchgehend
stdcall
.
Meine Frage: Ich kann für Exceptions aus der Anwendung ja einfach die Variable
Exception.GetExceptionStackInfoProc
auf eine Prozedur setzen die mir den Stacktrace ausliest (z.B. mit der JCL). Bei einer
Exception direkt aus einer
DLL wird das nie aufgerufen. Warum nicht? Was kann ich tun?
Ich habe keine Hoffnung, an den Stack aus der
DLL zu kommen. Aber wenigstens die Stelle aus der Hauptanwendung werde ich doch wissen können?
Ich bin ganz ehrlich, mir fehlt das Lowlevel-Wissen, was da intern passiert. Ohne wirklich zu verstehen was da vor sich geht probierte ich mal mit der Aufruf-Direktive
safecall
. Hier wird
Exception.GetExceptionStackInfoProc
wieder ganz normal aufgerufen, aber Delphi scheint das ganze irgendwie komisch zu wrappen und wirft am Schluss lieber eine dumme OleException welche die eigentliche
Exception nicht mehr beinhaltet.
Auf die Idee kam ich nur da
Wikipedia spricht:
Zitat:
The safecall calling convention is the same as the stdcall calling convention, except that exceptions are passed back to the caller in EAX as a HResult (instead of in FS:[0]), [...]
Kann ich Hoffnung haben, in meinem Hauptprogramm einfach überall
stdcall
durch
safecall
zu ersetzen? Mann, sind das wilde Gedanken.