Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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. тогда и логика на место становится - адрес функции передается по значению. а иначе я даже понять не могу что туда передается (указатель на адрес? а он где?) |
|
Вернуться к началу |
|
|
|