AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler abfangen von Plugin DLLs

Ein Thema von gsh · begonnen am 14. Jan 2009 · letzter Beitrag vom 18. Jan 2009
Antwort Antwort
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#1

Fehler abfangen von Plugin DLLs

  Alt 14. Jan 2009, 12:32
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?
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Fehler abfangen von Plugin DLLs

  Alt 14. Jan 2009, 12:51
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.
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#3

Re: Fehler abfangen von Plugin DLLs

  Alt 14. Jan 2009, 13:45
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?
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#4

Re: Fehler abfangen von Plugin DLLs

  Alt 16. Jan 2009, 18:01
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#5

Re: Fehler abfangen von Plugin DLLs

  Alt 18. Jan 2009, 13:10
hat den keiner mehr eine Idee?
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Fehler abfangen von Plugin DLLs

  Alt 18. Jan 2009, 13:31
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#7

Re: Fehler abfangen von Plugin DLLs

  Alt 18. Jan 2009, 17:14
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
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:08 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