Einzelnen Beitrag anzeigen

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, 12: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