TEventObject и веб-браузер

Я создал 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;

Мой вопрос: могу ли я каким-то образом предотвратить исключение или можно ли обнаружить нажатие мыши на вертикальной полосе прокрутки TWebbrowser, чтобы предотвратить исключение? Это исключение мне трудно решить, потому что я мало знаю о TEventObject и не понимаю, почему исключение возникает только при нажатии или перетаскивании вертикальной полосы прокрутки. Я могу предоставить больше информации, если это необходимо. Компилятор: Делфи 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]);

person Bill    schedule 04.01.2012    source источник
comment
d2d1.dll является частью MS Direct2D   -  person OnTheFly    schedule 04.01.2012
comment
Возможный дубликат gastonx.net/?p=10 :D   -  person TLama    schedule 04.01.2012
comment
@kobik, забавно, что переводчик Google определяет язык как шведский :) В любом случае +1; кажется, что никто из MS не исправил это.   -  person TLama    schedule 04.01.2012


Ответы (1)


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

System.Set8087CW($133F);

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

Math.SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]);
person kobik    schedule 04.01.2012
comment
Большое Вам спасибо. SetExceptionMask предотвращает исключение... См. мое редактирование. Могут ли быть от этого побочные эффекты? - person Bill; 04.01.2012
comment
Да, и все они в целом приложении. - person TLama; 04.01.2012
comment
У меня было долгое обсуждение этой проблемы. мой вывод, что нет никаких побочных эффектов. - person kobik; 04.01.2012
comment
@TLama - Что вы имеете в виду? Да, и все они во всем приложении ... не лучшая идея использовать SetExceptionMask? - person Bill; 04.01.2012
comment
@Bill, не более того, если вы разделите где-нибудь в своем приложении на 0, вы не получите исключения. И это обновление KB2488113 уже установлено на моем компьютере. так что ничего не исправлено. Что сказать, просто МС :) - person TLama; 04.01.2012