Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Не получается согласовать работу приложения и dll |
Автор: Курсант 5.6.2011, 18:09 | ||
Здравствуйте! Суть проблемы - есть dll, в ней три функции, все три возвращают тип данных float, параметров не принимают. Одна из функций (вторая) возвращает единицу. Подключаюсь динамически к dll, получаю указатели на все три функции. Поочередно вызываю их и вывожу получаемые от них значения на график. В итоге вторая функция возвращает единицу, а первая и третья - нуль (Хотя нуль они не могут возвращать). На случай если правильно удалось подключиться только к второй функции, поменял в исходнике dll логику второй функции, чтобы она выдавала всякие дробные значения - в итоге и вторая функция стала выдавать нуль. Вопрос - что за глюк? Может это разные формы представления типа float в dll и в моей программе? dll скомпилирована на gcc, а программа в C++ Builder 6.0. З.ы. На предыдущей программе все работало, но я потерял исходники и теперь переписываю заново, и вот, такой глюк :( Исходник прилагаю...
|
Автор: Курсант 5.6.2011, 18:50 |
Я использовал при загрузке библиотеки LoadLibrary... А в библиотеке используются глобальные переменные... Может ли быть, что LoadLibrary - неподходящая функция для запуска dll и ее работы с собственными глобальными переменными? |
Автор: borisbn 5.6.2011, 18:54 |
Прописан ли явно тип вызова функций (__cdecl, __stdcall)? Если нет, то нужно прописать. |
Автор: Курсант 5.6.2011, 19:23 |
Спасибо за ответ. Прописан __stdcall. Пробовал по-всякому.. и __fastcall, и __stdcall, и __cdecl, и WINAPI, и везде одно и то же получается. Сейчас удивился в очередной раз. Вывожу глобальную переменную времени из библиотеки таким же образом - время отсчитывается нормально (т.е. глобальная переменная времени в библиотеке накапливается). При этом время инкрементируется на стотысячные доли секунды... Все больше склоняюсь к тому, что форма представления чисел с плавающей точкой разная, но ведь это наверняка процессорный стандарт, и никак он различаться не может... Судя по наблюдениям, в ноль обращаются переменные, при вычислении которых в библиотеке используется операция умножения... Может и правда мантиссы как-то переподгоняются при умножении.. |
Автор: borisbn 5.6.2011, 22:20 |
Покажи исходники функций из библиотеки. И ещё: а как ты объединил чисто линуксовый gcc и чисто виндузёвый builder? Или ты имел в виду minGW? |
Автор: afiskon 5.6.2011, 22:28 |
В отладчике (каком-нибудь OllyDbg) посмотреть, что происходит, можете? Пробовали собрать библиотеку и программу одним компилятором? Проблема только с float, или также с double? |
Автор: Курсант 6.6.2011, 19:05 | ||||
эммм... пока проблема только с float... использовать один компилятор для библиотеки и для программы я не могу - к программе подключаются разные библиотеки. У всех у них одинаковые по названию функции внутри, но разный алгоритм преобразования. И компилировать их просто необходимо в gcc. А программа писана в Builder'e и если бы был способ эту программу компилировать с помощью gcc, я бы откомпилировал... Может попробовать другой Builder? У меня есть старая программа, тоже на Builder'e, но кажется с другого дистрибутива... Там, на этой программе, все работает... А на новой - не работает... Библиотеку прилагаю... model.c
model.h
Добавлено через 1 минуту и 33 секунды всмысле, с double я пока не проверял. Попробую сделать отладку в Olly, о результатах отпишусь позже... |
Автор: borisbn 6.6.2011, 19:45 |
Всё-таки явного типа вызова у тебя нет… Так как у тебя получилось объединить чисто линуксовый и чисто виндузёвый компилятор? А ClearVariables точно вызывается? |
Автор: Курсант 6.6.2011, 21:31 |
Не знаю насчет подружить - я использую компилятор gcc для windows... Проверяю насчет вызова ClearVariables... Добавлено через 2 минуты и 47 секунд Блин ![]() ![]() ![]() ![]() Я забыл вызвать ClearVariables... Все заработало ![]() |