![]() |
Fehler abfangen von Plugin DLLs
Hi Leute,
ich bin gerade dabei ein Pluginsystem in meiner Anwendung zu implementieren, damit jeder Entwickler ein Plugin für meine Anwendung erstellen kann. Nun weiß ich aber nicht wie gut diese die Plugins schreiben werden und ich kann mir gut vorstellen das dadurch Fehler auftreten können. Nun will ich das sobald ein Fehler in einer DLL auftreten eine Meldung ausgeben wird wo man nachlesen kann welche DLL es war und was sie für einen Fehler verursacht hat. Nur wie kann ich alle Fehler die von einer DLL kommen abfangen? |
Re: Fehler abfangen von Plugin DLLs
Wenn die Fehler in der DLL passieren, wird es schwierig. Die werden soweit ich weiß von try-execpt-Blöcken nicht erfasst.
Möglicherweise wäre es am besten, eine eigene Exception-Handler-Schnittstelle für die Plugins zu erzwingen? ZB indem dein Plugin Standardfunktionen bereitstellt, darunter auch eine Initialisierungsroutine, die den Exception-Handler der DLL überschreibt. Deine Anwendung könnte dann die Initialisierungsroutine des Plugins aufrufen. Ist die Funktion per GetProcAddress nicht verfügbar, hast du hier schon einen ersten Fehler, auf den du hinweisen kannst. |
Re: Fehler abfangen von Plugin DLLs
Zitat:
|
Re: Fehler abfangen von Plugin DLLs
:duck:
|
Re: Fehler abfangen von Plugin DLLs
hat den keiner mehr eine Idee?
|
Re: Fehler abfangen von Plugin DLLs
Du darfst schlicht und einfach nicht zulassen, das Plugin-DLLs Exceptions werfen. Native Exceptions wie Zugriffsverletzungen kannst du durch einen Try-Except-Block abfangen, aber dummerweise ist das Exception Dispatching mit Konstrukten wie raise oder throw überhaupt nicht standardisiert. Delphi verwendet hier auch den nativen Mechanismus mit einem speziellen Exception Code, aber andere Sprachen können das ganz anders halten. Wenn ein Plugin also tatsächlich eine Exception durchlässt, solltest du crashen. Darauf zu achten, dass Plugins fehlerfrei laufen, ist nicht deine Aufgabe. Fordere die Entwickler der Plugins auf, Try-Except-Blöcke um ihre Routinen zu legen und Fehler über einen Rückgabewert o. Ä. zu übertragen. Interessant könnte in dieser Hinsicht für dich die Aufrufkonvention safecall sein, d.h. Stdcall mit dem Rückgabewert HResult. Zumindest in Delphi wird das Plugin-seitige Exception-Handling so automatisch erledigt. Das könnte dann so aussehen:
Delphi-Quellcode:
Beachte hierbei, dass die Deklaration von Proc nicht der von PluginProc entspricht - es funktioniert aber, da das safecall letztlich zu einer "Umdeklaration" führt. Wenn du nun mal testweise in PluginProc eine Exception wirfst, fängt Delphi diese automatisch noch in der DLL ab und verändert den Rückgabewert, worauf dann im Hauptprogramm das Failed() anschlägt.
//Plugin
function PluginProc(...): TFoo; safecall; begin //... end; //Hauptprogramm var Proc: function(...; out Res: TFoo): HResult; stdcall; begin //Proc mit GetProcAddress laden if Failed(Proc(..., Result)) begin //Fehlermeldung ausgeben end else begin //mit Result weiterarbeiten end end; Diese Technik funktioniert allerdings nicht so gut in anderen Sprachen wie C, in denen es keine Compiler-Unterstützung für Safecall gibt. Dort muss das dann von Hand erledigt werden. |
Re: Fehler abfangen von Plugin DLLs
Vielen Dank Apollonius.
Hmm dann wird es doch das einfachste sein wenn ich die Funktionen mit einem try except Block umgebe und die Entwickler für die Plugins zu ermutigen keine Fehler einzubauen bzw. diese abzufangen :mrgreen: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz