DirectShow. BindToObject. Exception: Floating point division by zero
От: lastik160  
Дата: 24.12.15 09:40
Оценка:
Доброго времени суток! Стоит задача получения картинки с веб-камеры, для этого использую DirectShow. Для того чтобы получить устройство для захвата видео используется функция BindToObject, которая собственно и вываливается с исключением: Floating point division by zero. ПРИЧЕМ, это происходит только на планшетах Microsoft Surface. Все остальные веб-камеры (usb и в других планшетах) работают прекрасно, без каких-либо Exception.

Привожу этот кусок кода:


    
    FVideoCaptureFilter:  IBaseFilter;

    try
      MArray1[Listbox1.ItemIndex].BindToObject(NIL, NIL, IID_IBaseFilter, FVideoCaptureFilter);
    except
      on E:Exception do myEH.Log_('Exception in CreateGraph. MArray1[Listbox1.ItemIndex].BindToObject(NIL, NIL, IID_IMediaFilter, FVideoCaptureFilter). '+E.Message);
    end;


Может что-то с параметрами не так... В сети находил примеры, там реализация такая же.
Re: DirectShow. BindToObject. Exception: Floating point division by zero
От: Alexander G Украина  
Дата: 31.12.15 19:47
Оценка:
Здравствуйте, lastik160, Вы писали:

L>Может что-то с параметрами не так... В сети находил примеры, там реализация такая же.


Может, попробовать на время вызова отключить FPU исключения?
Set8087CW($133f);
Русский военный корабль идёт ко дну!
Re[2]: DirectShow. BindToObject. Exception: Floating point division by zero
От: lastik160  
Дата: 25.01.16 12:39
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, lastik160, Вы писали:


L>>Может что-то с параметрами не так... В сети находил примеры, там реализация такая же.


AG>Может, попробовать на время вызова отключить FPU исключения?

AG>Set8087CW($133f);

Спасибо за отклик.

procedure Set8087CW(NewCW: Word);
Sets the FPU control word.

On 32-bit Windows: This control word controls the precision of floating-point calculations, the rounding mode, and whether certain floating-point operations trigger exceptions.
On 64-bit Windows: This control word does not control floating-point operations, because the SSE register is used for floating point in 64-bit mode, instead of the FPU (floating-point unit).

У меня приложение 64-разрядное.
Воспользовался функцией function SetExceptionMask(const Mask: TArithmeticExceptionMask): TArithmeticExceptionMask
Все заработало.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.