Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

импорт-экспорт функции [адрес функции в списке параметров]

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
anotherche



Зарегистрирован: 28.03.2006
Сообщения: 2

СообщениеДобавлено: Вт Мар 28 2006 10:24    Заголовок сообщения: импорт-экспорт функции [адрес функции в списке параметров] Ответить с цитатой

предыстория вопроса такова:
один знакомый за долгие годы работы с паскалем наработал некоторое количество полезных расчетных алгоритмов. а мне привычней писать на С++. поэтому я решил скомпилировать его сокровища в dll. библиотеку собирал free pascal'ем. при компиляции указывал директиву { $CALLING CDECL} .

при импорте функций в C код получилось следующее: разные там функции со средненормальными сигнатурами типа (или подобными)
Код:
Procedure mytest(Var x : double);cdecl; export;

нормально импортируются и работают, ну например, предыдущая функция импортируется с сигнатурой типа
Код:
void (__cdecl *LPDLLFUNC)(double*);

Но вот когда в списке аргументов функции присутствует адрес функции (который нужно передать алгоритму для нахождения каких-нибудь там корней, экстремумов и пр.) начинаются проблемы. Такие функции импотируются без ошибок, но при их вызове возникает ошибка. Например, такая вот типичная функция
Код:
Procedure FunTest(Var Fun : Fun_Type1; Xstart,DelX,Eps : double;Var Root : double);cdecl; export;

где Fun_Type1 описан как
Код:
Fun_Type1 =Function( X : double) : double;

импортируется как
Код:
void (__cdecl *LPDLLFUNC1)(lpfnDllTest, double, double, double, double*);

где тип lpfnDllTest описан как
Код:
double (__cdecl *pfnDllTest)(double);

при импорте ошибок нет, но при вызове импортированной функции ошибка происходит. что не так? где я ошибаюсь? есть ли какие подводводные камни при экспорте - импорте таких функций? может паскалевскую функцию не так задавать нужно? я с этими Var до конца не понимаю ситуацию - это всегда указатели, или для функций есть какие особенности?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
kolobok0



Зарегистрирован: 22.04.2005
Сообщения: 253
Откуда: Мсква

СообщениеДобавлено: Вт Мар 28 2006 14:53    Заголовок сообщения: Re: импорт-экспорт функции [адрес функции в списке параметров] Ответить с цитатой

anotherche писал(а):
...при импорте ошибок нет, но при вызове импортированной функции ошибка происходит. что не так? где я ошибаюсь? есть ли какие подводводные камни при экспорте - импорте таких функций? может паскалевскую функцию не так задавать нужно? я с этими Var до конца не понимаю ситуацию - это всегда указатели, или для функций есть какие особенности?


при сопряжении различных языков обычно встречаются проблемы двух видов..
а) правила очистки стэка..
б) передаваемые параметры...

первого рода проблемы - в общем то просто... вариант одын... вызывающий код заталкивает на стэк перед вызовом нечто и после возврата - столько же байт и вынимает со стэка...
вариант два... вызывающий код заталкивает на стэк параметры...вызывает подпрограммку... при возврате ничего не делает... всё освободила подпрограмма...

второго рода проблемы - то же ничего сложного... вы передаёте например параметр как целое в 2 байта, а подпрограммка ожидает например указатель на енту хрень... и т.д...вариантов достаточно...

что делать...
быстрее всего - это ассемблерный отладчик...глазками посмотреть что передаёться, как очищаеться, как идёт обращение... обычно для этих дел делают элементарные примеры содержащие просто тупые вызовы, повторяющие основную схему. Если вызов зарыт далеко (например в клипере) - то используем в теле нашего кода чуть ли не азм директивы int 3h..ну далее опять отладчик в подмогу...

второе направление захода - поможет дока на те программные средства которые юзаете..так же ничего экстраординарного...читаете - строго выполняете...радуетесь жизни...

с уважением
(круглый)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
anotherche



Зарегистрирован: 28.03.2006
Сообщения: 2

СообщениеДобавлено: Вт Мар 28 2006 17:15    Заголовок сообщения: Ответить с цитатой

все. нашел. функцию нужно передавать без Var. тогда и логика на место становится - адрес функции передается по значению. а иначе я даже понять не могу что туда передается (указатель на адрес? а он где?)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...