Как избежать появления ошибки? - PullRequest
2 голосов
/ 29 мая 2011

Как избежать ошибки при отображении маленького окна с ошибкой Windows?
Try и Except не работают, потому что ошибка не отображается Delphi, а из программы или, я думаю, из Windows.
enter image description here
try<br> Size:=TFileStream.Create(BitFile,fmOpenRead);<br> except on E: EFCreateError<br> do EC.Add('Error: ' + IntToStr(GetLastError));<br> end;

Ответы [ 3 ]

7 голосов
/ 29 мая 2011

Показана ли ошибка в вашем приложении? Иначе говоря, это необработанное исключение? Или это окно, отображаемое Windows или внешним приложением?

Вы говорите 'событие', но обработчики событий также могут содержать блоки try..except.

Если это исключение, и вы не знаете, откуда оно, вы можете использовать класс TApplicationEvents, чтобы прикрепить событие Application.OnException. Он сработает во всех необработанных исключениях. Там вы можете поймать его, или, скорее, установить точку останова и использовать трассировку стека, чтобы увидеть, откуда исходит исключение.

3 голосов
/ 29 мая 2011

Поле ошибки не означает, что возникла исключительная ситуация.Поле ошибки может быть явно показано в коде.

Похоже, у вас возник вопрос: «Как я могу запретить стороннему коду работать как разработано?».Боюсь, что кроме декомпиляции двоичных файлов я не могу многое предложить, особенно если у вас нет исходного кода.

Если у вас есть исходный код и вы знаете процедуру, которую необходимо заменить, вы можетенаписать свою собственную замену и «угнать» рутину во время выполнения.Этот метод используется, например, проектом fastcode для замены подпрограммы delphi без перекомпиляции VCL.Вы можете увидеть реализацию в их проекте.

http://fastcode.sourceforge.net/

Единица измерения: FastcodePatch.pas

0 голосов
/ 29 мая 2011

Вот оно

 private
    { Private declarations }
  public
   procedure MyExceptionHandler(Sender : TObject; E : Exception ); //define exception handler
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MyExceptionHandler(Sender:TObject;E:Exception);
begin
    //Do nothing
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnException := MyExceptionHandler;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  //Generate an exception
  asm
  mov eax,8272
  mov [eax],$2FFFFF
  end 
end;
...