TEventObject и WebBrowser - PullRequest
       25

TEventObject и WebBrowser

4 голосов
/ 04 января 2012

Я создал TEventObject, чтобы обеспечить OnMouseDown и OnMouseMove события для TWebBrowser. События отлично работают при перемещении мыши и щелчке в веб-браузере, но когда я прокручиваю или нажимаю вертикальную полосу прокрутки веб-браузера, возникает EZeroDivide исключение. EurekaLog сообщает об исключении EZeroDivide в d2d1.dll. Я пытался перехватить исключение, но ничего из того, что я пробовал, похоже не работает:

function TEventObject.Invoke( DispID: integer; const IID: TGUID; LocaleID: integer; Flags: Word; var Params;
  VarResult, ExcepInfo, ArgErr: Pointer ): HResult;
begin
  try
    if ( DispID = DISPID_VALUE ) then
    begin
      if Assigned( FOnEvent ) then
        FOnEvent;
      Result := S_OK;
    end
    else
    begin
      FOnEvent := nil;
      Result := E_NOTIMPL;
    end;
  except
    on EZeroDivide do
    begin
      FOnEvent := nil;
      Result := E_NOTIMPL;
    end;
  end;
end;

У меня вопрос: можно ли как-то предотвратить исключение или можно обнаружить mousedown на вертикальной полосе прокрутки TWebbrowser, чтобы предотвратить исключение? Это исключение трудно решить, потому что я мало что знаю о TEventObject и не понимаю, почему исключение возникает только при нажатии или перетаскивании вертикальной полосы прокрутки. Я могу предоставить больше информации, если это необходимо. Компилятор: Delphi 2010.

[Изменить] Смотрите этот пост: http://www.codenewsfast.com/cnf/article/0/waArticleBookmark.7401953 Очень простое демо-приложение доступно по адресу: http://dl.dropbox.com/u/2167512/bugs/ie9/ie9_bug.zip

Это предотвращает ошибку:

Math.SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide,exOverflow, exUnderflow, exPrecision]);

1 Ответ

2 голосов
/ 04 января 2012

попробуйте отключить исключения FPU:

System.Set8087CW($133F);

В более новых версиях Delphi:

Math.SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]);
...