The Wiert Corner – irregular stream of stuff

Jeroen W. Pluimers on .NET, C#, Delphi, databases, and personal interests

  • My badges

  • Twitter Updates

  • My Flickr Stream

  • Pages

  • All categories

  • Email Subscription

    Enter your email address to subscribe to this blog and receive notifications of new posts by email.

    Join 717 other subscribers

Delphi: mapping of COM/Windows exceptions to Delphi Exceptions and run-time errors

Posted by jpluimers on 2014/07/30

Every time

[sourcecode language=”text”]
—————————
Debugger Exception Notification
—————————
Project Some.exe raised exception class $C0000005 with message ‘access violation at 0x00537b14: read of address 0x00000000’.
—————————
Break Continue Help
—————————

‘Exception "EAccessViolation" with message "Access violation at address 00537B30 in module ”TestWordInterface.exe”. Read of address 00000000" at address 00537B30’

—————————
Testwordinterface
—————————
Access violation at address 00537B14 in module ‘Some.exe’. Read of address 00000000.
—————————
OK
—————————
[/sourcecode]

In system.pas:

[sourcecode language=”text”]
{$IFDEF STACK_BASED_EXCEPTIONS}
procedure MapToRunError(P: PExceptionRecord); stdcall;
const
STATUS_ACCESS_VIOLATION = $C0000005;
STATUS_ARRAY_BOUNDS_EXCEEDED = $C000008C;
STATUS_FLOAT_DENORMAL_OPERAND = $C000008D;
STATUS_FLOAT_DIVIDE_BY_ZERO = $C000008E;
STATUS_FLOAT_INEXACT_RESULT = $C000008F;
STATUS_FLOAT_INVALID_OPERATION = $C0000090;
STATUS_FLOAT_OVERFLOW = $C0000091;
STATUS_FLOAT_STACK_CHECK = $C0000092;
STATUS_FLOAT_UNDERFLOW = $C0000093;
STATUS_INTEGER_DIVIDE_BY_ZERO = $C0000094;
STATUS_INTEGER_OVERFLOW = $C0000095;
STATUS_PRIVILEGED_INSTRUCTION = $C0000096;
STATUS_STACK_OVERFLOW = $C00000FD;
STATUS_CONTROL_C_EXIT = $C000013A;
var
ErrCode: Byte;
begin
case P.ExceptionCode of
STATUS_INTEGER_DIVIDE_BY_ZERO: ErrCode := 200; { reDivByZero }
STATUS_ARRAY_BOUNDS_EXCEEDED: ErrCode := 201; { reRangeError }
STATUS_FLOAT_OVERFLOW: ErrCode := 205; { reOverflow }
STATUS_FLOAT_INEXACT_RESULT,
STATUS_FLOAT_INVALID_OPERATION,
STATUS_FLOAT_STACK_CHECK: ErrCode := 207; { reInvalidOp }
STATUS_FLOAT_DIVIDE_BY_ZERO: ErrCode := 200; { reZeroDivide }
STATUS_INTEGER_OVERFLOW: ErrCode := 215; { reIntOverflow}
STATUS_FLOAT_UNDERFLOW,
STATUS_FLOAT_DENORMAL_OPERAND: ErrCode := 206; { reUnderflow }
STATUS_ACCESS_VIOLATION: ErrCode := 216; { reAccessViolation }
STATUS_PRIVILEGED_INSTRUCTION: ErrCode := 218; { rePrivInstruction }
STATUS_CONTROL_C_EXIT: ErrCode := 217; { reControlBreak }
STATUS_STACK_OVERFLOW: ErrCode := 202; { reStackOverflow }
else ErrCode := 255;
end;
RunErrorAt(ErrCode, P.ExceptionAddress);
end;
[/sourcecode]

Leave a Comment