Das Thema ist ein wenig seltsam
Probiere, aber vergiss nicht ich hab das hurtig zusammengeflickt ohne so genau zu wissen was ich tue, einen Versuch mit einem Vectored
Exception Handling.
Zumal der installierte Handler die ganze Zeit den Prozess überlebt besser kurz vor deinem Aufruf welcher schief geht installieren und hernach gleich wieder deinstallieren. Je nachdem was dieser Handler als Rückgabewert gibt wird die Anwendung gezwungen eine
Exception zu handeln, nicht oder weiter die Liste mit vektorbasieren Exeception Handlern abzuklappern.
Delphi-Quellcode:
unit VEH;
(*
LONG CALLBACK VectoredHandler(
_In_ PEXCEPTION_POINTERS ExceptionInfo
);
PVOID WINAPI AddVectoredExceptionHandler(
_In_ ULONG FirstHandler,
_In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler
);
ULONG WINAPI RemoveVectoredContinueHandler(
_In_ PVOID Handler
);
ULONG WINAPI RemoveVectoredContinueHandler(
_In_ PVOID Handler
);
PVOID WINAPI AddVectoredContinueHandler(
_In_ ULONG FirstHandler,
_In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler
);
*)
interface
{$IFDEF WIN32}
uses Windows;
//Handler
const CALL_FIRST = 1;
const CALL_LAST = 0;
const EXCEPTION_CONTINUE_EXECUTION = -1;
const EXCEPTION_CONTINUE_SEARCH = 0;
const EXCEPTION_EXECUTE_HANDLER = 1;
type PVECTORED_EXCEPTION_HANDLER =
function(
const ExceptionInfo: _EXCEPTION_POINTERS): LongInt
cdecl {$IFDEF WIN32} stdcall {$ENDIF};
// Installed after First Chance Exception
function AddVectoredExceptionHandler(
const FirstHandler: ULONG;
const VectoredHandler: PVECTORED_EXCEPTION_HANDLER): PVOID;
stdcall;
function RemoveVectoredExceptionHandler(
const VectoredHandlerHandle: PVOID): ULONG;
stdcall;
function AddVectoredContinueHandler (
Const FirstHandler: ULONG;
const VectoredHandler: PVECTORED_EXCEPTION_HANDLER): PVOID;
stdcall;
function RemoveVectoredContinueHandler (
const VectoredHandlerHandle: PVOID) : ULONG;
stdcall;
implementation
function AddVectoredExceptionHandler;
external kernel32
name '
AddVectoredExceptionHandler'
function RemoveVectoredExceptionHandler;
external kernel32
name '
RemoveVectoredExceptionHandler'
function AddVectoredContinueHandler;
external kernel32
name '
AddVectoredContinueHandler'
function RemoveVectoredContinueHandler;
external kernel32
name '
RevomeVectoredContinueHandler'
{$ENDIF}
end.
Handler und Aufruf ...
Delphi-Quellcode:
uses VEH;
function ForceExceptionHandling(
const ExceptionInfo: TExceptionPointers): Longint;
stdcall;
begin
// writeln('Vextored Exception Handler');
Result := EXCEPTION_CONTINUE_EXECUTION;
//Result := EXCEPTION_EXECUTE_HANDLER;
//Result := EXCEPTION_CONTINUE_SEARCH;
end;
procedure TForm1.bnVecotoredEhClick(Sender: TObject);
var
resf : Pointer;
dummy : integer;
begin
try
//try
//writeln('Adding First Handler : EXCEPTION_CONTINUE_EXECUTION');
resf:=AddVectoredExceptionHandler(CALL_FIRST, ForceExceptionHandling);
//writeln('Raising Exception');
raise EExternalException.Create('
Howdy friends and neighbors');
dummy := 1;
//except
//end;
finally
//writeln('Removing First Handler : EXCEPTION_CONTINUE_EXECUTION');
RemoveVectoredExceptionHandler(resf);
end;
Am Fehler wird es nichts ändern. Ich kann leider keine Windows
Exception auslösen, so in der Richtung. Diese
Exception Handling Routinen werden nach der First Chance
Exception ausgeführt.
Wäre für
Win32. EXCEPTION_CONTINUE_EXECUTION führt auf der Kommadozeile im Debugger zum Crash der Applikation. Im Fall von
VCL was nicht viel sagt. EXCEPTION_EXECUTE_HANDLER könnte sein was du braucht. Das war bisher unproblematisch. Die ExceptionInfo im Handler ist gefüllt.