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.