Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehler abfangen von Plugin DLLs (https://www.delphipraxis.net/127489-fehler-abfangen-von-plugin-dlls.html)

gsh 14. Jan 2009 11:32


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?

nuclearping 14. Jan 2009 11:51

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.

gsh 14. Jan 2009 12:45

Re: Fehler abfangen von Plugin DLLs
 
Zitat:

Zitat von nuclearping
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.

hmm also initialisieren muss ich die Plugins sowieso aber geht dies auch wenn die DLLs nicht mit Delphi geschrieben wurden? Wie würde das dann ungefähr aussehen?

gsh 16. Jan 2009 17:01

Re: Fehler abfangen von Plugin DLLs
 
:duck:

gsh 18. Jan 2009 12:10

Re: Fehler abfangen von Plugin DLLs
 
hat den keiner mehr eine Idee?

Apollonius 18. Jan 2009 12:31

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:
//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;
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.
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.

gsh 18. Jan 2009 16:14

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 07:03 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