16,748
社区成员
发帖
与我相关
我的任务
分享
procedure TFormMain.AppException(Sender: TObject; E: Exception);
begin
if (E is EIdSocketError) or (E is EInvalidOperation) then
begin
//*******************
end
else if E.Message = '更新文件失败' then
begin
//************
end
else
Application.MessageBox(PChar(E.Message), PChar(E.ClassName));
end;
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function AddVectoredExceptionHandler(FirstHandler: ULONG; VectorHandlerFunc: Pointer): THandle; stdcall; external 'Kernel32.dll';
function ExceptionHandler(const exce: TExceptionPointers): LongInt; stdcall;
const
EXCEPTION_CONTINUE_SEARCH = 0;
EXCEPTION_EXECUTE_HANDLER = 1;
EXCEPTION_CONTINUE_EXECUTION = -1;
var
pr: Windows.PExceptionRecord;
begin
pr := exce.ExceptionRecord;
ShowMessage(Format('发生异常%.8x 异常地址%.8x',
[pr.ExceptionCode, Cardinal(pr.ExceptionAddress)]));
if pr.ExceptionCode = $80000003 then
begin
exce.ContextRecord.ContextFlags := CONTEXT_CONTROL;
exce.ContextRecord.Eip := exce.ContextRecord.Eip + 1;
Result := EXCEPTION_CONTINUE_EXECUTION;
Exit;
end;
Result := EXCEPTION_CONTINUE_SEARCH;
end;
procedure MyThread();
begin
asm
int 3
end;
end;
procedure TForm1.btn1Click(Sender: TObject);
var
lp: Cardinal;
begin
CreateThread(nil, 0, @MyThread, nil, 0, lp);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
AddVectoredExceptionHandler(0, @ExceptionHandler);
end;
end.
要自己处理seh,例子在上,处理int3异常,并恢复运行。