Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.146.221.204] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Здравствуйте. Использую dll в VS C++ написанную в Borlande. Эта dll писалась для одного приложения, в котором она отлично работает.
Используя эту .dll в VS, вылетает ошибка floating-point invalid при использовании одной из функций. Ковыряю dll в IDA pro, обнаружил, что ошибка вылетает при выполнении следующей конструкции: do { ... var = (unsigned __int64) (pow(2.0, (double) k) - 1.0); ... k++; } while(k < 64) Попробовал выполнить этот код в консольном приложение VS, вылетает точно такая же ошибка: floating-point invalid. Как быть? Почему в приложении собранном в Borland эта .dll успешно работает, при использовании же в VS вылетает ошибка. Кстати под Win x64 .dll так же работает, по понятным причинам. С чем это связано? VS при сборке проекта изменяет эту .dll, может нужны какие нибудь параметры компиляции? Было бы здорово заменить конструкцию приведённую выше на: do { ... var = ((unsigned __int64) 1 << k) - 1; ... k++; } while(k < 64) |
Сообщ.
#2
,
|
|
|
Соглашение о вызове совпадает?
|
Сообщ.
#3
,
|
|
|
100%
В Win x64 же работает. |
Сообщ.
#4
,
|
|
|
А код этой DLL есть? Это функция pow?
|
Сообщ.
#5
,
|
|
|
Нету. Только псевдокод в IDA.
Добавлено Нет, это не функция pow(). То что я привёл, это кусок псевдокода из IDA. Несколько итераций проходит, потом падает. Добавлено Как вообще происходит использование .dll. В нете не могу найти инфу. Просто мне кажется, что компилятор что то делает с этой .dll. Добавлено Хотя нет. Exe собранная на Win64 под x86 запускается только на Win64, если запустить на Win32, то падает. Компилятор здесь не причём. Это винда значит, что-то делает. |
Сообщ.
#6
,
|
|
|
А что делает эта функция-то вообще?
Прикрепите эту DLL-ку и вызов функции (нерабочий и рабочий код - VS, Borland). Сложно что-то сказать, ничего не видя... Вызов функции из DLL происходит как обычный вызов функции. Небольшие отличия есть только в вызове через указатель (GetProcAddress) и когда DLL грузится системой (когда функция в импорте), но на работе это никак не должно отражаться. |
Сообщ.
#7
,
|
|
|
Цитата 100% В Win x64 же работает. В 64-битном режиме соглашение о вызове единственное, так что это не аргумент. Покажи объявление функции в DLL, если оно есть и в использующем её приложении Билдера и VS |
Сообщ.
#8
,
|
|
|
Не в 64 битном режиме, а на 64 битной винде 32 битное приложение.
Добавлено Ок. Скоро скину сюда. |
Сообщ.
#9
,
|
|
|
Еще вариант - посмотреть, совпадает ли кодовое слово сопроцессора 8087CW
|
Сообщ.
#10
,
|
|
|
А можно по подробнее ? Где в VS глянуть?
Добавлено Сразу же не вкурил что вы имели ввиду. Вы имеете ввиду слово состояния сопроцессора. Хм. Как узнать, какой используется в том приложении. В IDA pro? Но как? |
Сообщ.
#11
,
|
|
|
IDA не пользовался. В отладчике Borland его состояние можно видеть.
В Borland-овских продуктах его получают функцией Get8087CW и устанавливают Set8087CW. Если аналоги есть в VS, то можно сравнить состояние перед вызовом |
Сообщ.
#12
,
|
|
|
У меня только .dll. Нет возможности запустить в отладке.
|
Сообщ.
#13
,
|
|
|
В отладке запускается приложение, использующее DLL.
Приложение же своё, самописное? Тогда и отладка не нужна - вывести слово состояния перед вызовом. |
Сообщ.
#14
,
|
|
|
Да самописное. Народ подскажите как в плюсах (WinAPI) установить слово состояния арифметического сопроцессора. Или без ассемблера ни как не обойтись? И какой слово состояния используется в делфях по дефолту???
|
Сообщ.
#15
,
|
|
|
$1332 или $1372
|