AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Nicht behandelte Exception in DLL zentral behandeln

Nicht behandelte Exception in DLL zentral behandeln

Ein Thema von Bernhard Geyer · begonnen am 14. Nov 2014 · letzter Beitrag vom 20. Jan 2015
Antwort Antwort
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#1

Nicht behandelte Exception in DLL zentral behandeln

  Alt 14. Nov 2014, 13:39
Delphi-Version: 6
Ich habe hier den Fall das ein Exe mit anderen Delphi-Version als eine verwendet DLL compiliert wurde.
Hier bekomme ich bei unbehandelten Exception keine vernünftige Meldung sondern ein "Fehler an Adresse xxx" da Delphi hier bei einer Exception an Windows ein entsprechendes Record übergibt und ein Element davon ein TObject ist.
Und da ja D6.TObject != XE6.TObject ist kracht es da hier wenn die Exception XE6 erzeugt wurde und in D6 versucht wird zu behandeln.

Was brauche ich:

Welche Möglichkeiten gibt es hier einzugreifen das ich bei Auftreten einer Exception erkenne ob es ein try...except/finally gibt oder ob die Exception komplett nach oben "durchläuft". Und im Fall das es kein try...except/finally gibt diese über ein DLL-Schnittstellenmethode an die Exe weitergeben kann?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Nicht behandelte Exception in DLL zentral behandeln

  Alt 14. Nov 2014, 13:49
Ganz einfach:

Man reicht einfach keine Exceptions über die DLL-Grenzen hinaus. Es gibt Rückgabewerte und die Rückgabewerte können geprüft werden. Zusätzlich kann es noch etwas wie MSDN-Library durchsuchenGetLastError geben.

Die Exception selber wirft dann die Anwendung, die die DLL benutzt (z.B. so wie Delphi-Referenz durchsuchenRaiseLastOSError)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Nicht behandelte Exception in DLL zentral behandeln

  Alt 14. Nov 2014, 14:31
Ganz einfach:

Man reicht einfach keine Exceptions über die DLL-Grenzen hinaus. Es gibt Rückgabewerte und die Rückgabewerte können geprüft werden. Zusätzlich kann es noch etwas wie MSDN-Library durchsuchenGetLastError geben.

Die Exception selber wirft dann die Anwendung, die die DLL benutzt (z.B. so wie Delphi-Referenz durchsuchenRaiseLastOSError)
Der "normale" läuft ja über Rückgabecodes. Jedoch wurde bei der Schnittstelle das Exceptionhandling vollkommen außer acht gelassen.
Das jetzt nachzubauen (Tritt ja erst auf nachdem wir XE6 verwenden statt bisher D6, Alles auf einen Schlag umstellen geht auch nicht) würde Wochen dauern. Hier muss ein Lösung her die das auf über Hooking oder ähnliches direkt löst.

Wenn jetzt die Exception im D6-Teil erzeugt wird erkennt ja die XE6-Verison das es sich um eine Delphi-Exception handelt. (System._HandleAnyException). Es kracht dann beim Zugriff auf den RaiseListPtr (System.ExceptObject).

Meine Idee wäre jetzt auf dieser Ebene (Vermutlich würde Hooking von TApplication.HandleException reichen) und eine Erkennung einzubauen ob das Exception-Objekt wirklich ein D6.TObject ist. Falls nein dann die Plugins fragen ob dieses Objekt von ihnen kommt und dann über die DLL-Schnittstelle den Exception-Text abfragen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#4

AW: Nicht behandelte Exception in DLL zentral behandeln

  Alt 14. Nov 2014, 15:49
Die Exceptionbehandlung ist in der System.pas geht absichtlich auf Pointer und nicht TObject oder gar auf Exception.
In Delphi sind zwar alle Exceptions von Exception abgeleitet, aber dann getrennter RTTI hat die DLL eigene Versionen von TObject/Exception, welche grundsätlich nicht kompatibel mit der EXE sind, vorallem nicht wenn es sich um unterschiedliche Compiler handelt.
Delphi Version X, Delphi Version Y, C++Builder, C++, Free Pascal oder sonstwas.

In der EXE kommt also eine "Exception" an, aber sie wird nicht als Delphi-Exception-Klasse erkannt.
Man könnte jetzt natürlich in der EXE diese Exception behandeln und über blinde Casts oder Zeigergefummele den Klassennamen und die Message auslesen, aber besser ist es das in der DLL zu behandeln und auf anderen Wege (z.B. Fehlercodes) rauszugeben.

Zitat:
Meine Idee wäre jetzt auf dieser Ebene (Vermutlich würde Hooking von TApplication.HandleException reichen) und eine Erkennung einzubauen ob das Exception-Objekt wirklich ein D6.TObject ist. Falls nein dann die Plugins fragen ob dieses Objekt von ihnen kommt und dann über die DLL-Schnittstelle den Exception-Text abfragen.
Könnte man machen, indem man den Speicher analysiert, wichtige Daten ausliest und dann entweder selber die Exception behandelt, oder aus diesen Daten ein neues Exception-Objekt erstellt, welches weitergegeben wird.



Alternativ linkt man halt DLL und EXE gegen die RTL und schon kann man die Exceptions problemlos rausgeben.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (14. Nov 2014 um 15:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Nicht behandelte Exception in DLL zentral behandeln

  Alt 14. Nov 2014, 15:53
In der EXE kommt also eine "Exception" an, aber sie wird nicht als Delphi-Exception-Klasse erkannt.
Eben doch. Sie wir als Dephi-Exception erkannt obwohl sie nicht ausgewertet werden kann.
Liegt an der Magic-Number die hier Delphi verwendet und nicht zwischen den Delphi-Versionen geändert wurde.

Man könnte jetzt natürlich in der EXE diese Exception behandeln und über blinde Casts oder Zeigergefummele den Klassennamen und die Message auslesen, aber besser ist es das in der DLL zu behandeln und auf anderen Wege (z.B. Fehlercodes) rauszugeben.
Mir reicht es ja zu erkennen das es eine Nicht-Kompatible Delphi-Exception ist und dann über selbst entwickeltes DLL-API den Typ+Text rauszukommen.


Alternativ linkt man halt DLL und EXE gegen die RTL und schon kann man die Exceptions problemlos rausgeben.
Diese Alternative gibt es hier nicht. Wir verwenden Absichtlich keine BPL's
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Nicht behandelte Exception in DLL zentral behandeln

  Alt 20. Jan 2015, 14:22
Rein interessenshalber: Wie hat es sich letztendlich ergeben, wie habt ihr das Problem gelöst?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Nicht behandelte Exception in DLL zentral behandeln

  Alt 20. Jan 2015, 14:29
Bisher gar nicht.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

AW: Nicht behandelte Exception in DLL zentral behandeln

  Alt 20. Jan 2015, 15:04
Und wenn du eine Wrapper-DLL schreibst Und dort den inkompatiblen Fehler abfängst?
Soweit ich das jetzt verstanden habe, nervt dich nur, das die Exception nicht auswertbar ist. Wenn Du sie aber abfangen kannst, dann kapsele das invalide Exception-Objekt in einer 'EIncompatibleDelphiException' Exception und später kannst Du ja probieren, ob Du den Typ/Klasse nicht doch rausbekommst.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 22:44 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