Re: Вызов DLL функции из VBA, после чего вылазит Runtime Error 6 - overflow
От: PimpDaddy Россия  
Дата: 27.07.12 15:15
Оценка: 6 (1)
Пообщаюсь немного сам с собой. Надеюсь, кому-нибудь будет полезно.

В одной из LIB оказалась глобальная переменная типа double, которую линкер не соптимизировал.
Эта переменная инициализируется примерно так:

const double x = std::numeric_limits<double>::signaling_NaN();


Инициализация происходит в функции _CRT_INIT(), которая вызывается до DllMain. Я ещё не до конца разобрался, но вставляя разный код и вызывая _statusfp() я понял, что эта инициализация изменяет "floating-point status word". Конкретно эта строчка выставляет бит _EM_INVALID. Ну а если кто-нибудь потом поменяет маску FPU исключений и заенэйблит эти исключения, то FPU исключение и полетит.

Видимо, при входе в Dll все FPU исключения отрублены, инициализация переменной выставляет флаг _EM_INVALID, по возвращению в VBA маска исключений меняется и исключение бросается.

Желаю всем пореже сталкиваться с таким гЭ. Пис!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.