![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача PDouble в dll, компилированную в Билдере [D7, XP]
Stunt © (2008-02-19 13:38:00)Здравствуйте.
Имеется библиотека, скомпилированная на билдере, функции из которой экспортируются в мой проект статически.
В моем проекте необходимо передать одной такой функции аргумент типа PDouble, после чего функция должна вернуть некоторое значение
через этот же указатель.
procedure TChannel.SetFrStatic(Value : Double);
var
PDValue:PDouble;
begin
New(PDValue);
PDValue^:=Value;
FFrStatic:=Value;
if Value >= 0 then
begin
if FEnabled then
begin
Analog_FreqGen_SetFrequency(Num,PDValue);
FFrStaticMEasured:=Value;
end;
end;
Dispose(PDValue)
end;
Возникают 2 ситуации.
1) Если скомпилировано без оптимизации. Функция работает, но меняется другое поле этого же классаFEnabled, которое стоит на условии (!) . Объяснить не могу, вылечить соотвественно тоже
2) Если скомпилировано с оптимизацией. Функция выдает AV внутри библиотеки.
Предпринятые меры:
-Игрался с параметрами компиляции, в частности генерировал С и С++ объектные файлы - не помогает;
- Инициализировал переменную типа PDouble через GetMem ... освобождал через FreeMem - не помогает (эффект AV на том же адресе)
;
- Ну и совсем отчаявшись, выделял через GlobalAlloc - не помогает (эффект AV на том же адресе)
Вопрос: В чем может быть решение ?
Заранее спасибо
Сергей М. (2008-02-19 14:42:00) [1]
> Palladin © (19.02.08 14:40) [25]
))
Полны радости штаны)
Palladin (2008-02-19 14:40:00) [2]о... level up получил...
Running man (aka Stunt) (2008-02-19 14:39:00) [3]Это cdecl !!! Сергей М., отныне я считаю Вас на 50% менее ядовитым, чем считал ранее!!!!
Running man (aka Stunt) (2008-02-19 14:25:00) [4]>Сергей М. © (19.02.08 14:24) [22]
Так и сделаю, спасибо за совет.
Сергей М. (2008-02-19 14:24:00) [5]Зачем ?
Выясни под отладчиком, какое на самом деле там соглашение .. Его и укажешь потом у себя ...
Running man (aka Stunt) (2008-02-19 14:23:00) [6]Что, теперь стек восстанавливать вручную?
Сергей М. (2008-02-19 14:22:00) [7]
> в старых сорцах сишных исходников
Судя по
> AV на выходе из процедуры
возникают подозрения, что там не stdcall, а cdecl ..
Running man (aka Stunt) (2008-02-19 14:22:00) [8]Ой звиняйте, совсем ум за разум заходит :
int __declspec(dllexport) Analog_FreqGen_SetFrequency(int Index, double *Frequency);
Running man (aka Stunt) (2008-02-19 14:19:00) [9]Есть, как раз прототип - в старых сорцах сишных исходников. Вот он:
int Analog_FreqGen_SetFrequency(int Index, double *Frequency)
Сергей М. (2008-02-19 14:16:00) [10]
> Обертка написана разработчиком билдерного модуля
На паскале ?!
А на Си прототип имеется для сравнения ?
Running man (aka Stunt) (2008-02-19 14:14:00) [11]>Сергей М. © (19.02.08 14:13) [15]
Обертка написана разработчиком билдерного модуля
Сергей М. (2008-02-19 14:13:00) [12]"Обертка" откуда взялась ? Ты ее сам писал, от балды ? Или на основании прототипа, предоставленного разработчиком билдерного модуля ?
Running man (aka Stunt) (2008-02-19 14:07:00) [13]Уже подставил. Результат - AV на выходе из процедуры (правда, адрес уже другой)
Palladin (2008-02-19 14:07:00) [14]хм... а в прошлый раз stdcall небыло...
Сергей М. (2008-02-19 14:06:00) [15]
> Running man (aka Stunt) (19.02.08 14:03) [10]
А в [3] тогда что ? Там тоже "обертка", но соглашение не указано.
?
Running man (aka Stunt) (2008-02-19 14:06:00) [16]Не из экспортного, понял уже -копипаст )
Running man (aka Stunt) (2008-02-19 14:03:00) [17]Сергей М. © (19.02.08 13:57) [9]
Вот обертка из экспортного pas'a
function Analog_FreqGen_SetFrequency(Index: DWORD; Frequency: PDouble) : DWORD; stdcall;external 'AnalogHAL.dll' index 16;
Сергей М. (2008-02-19 13:57:00) [18]
> Running man (aka Stunt) (19.02.08 13:55) [8]
Билдер по умолчанию использует stdcall.
Кто ж его заставит использовать дифолтное дельфийское соглашение (fastcall pascal) кроме самого разработчика ? Он же Билдер)
Running man (aka Stunt) (2008-02-19 13:55:00) [19]>oxffff © (19.02.08 13:51) [5]
Имеется ввиду, уточнить какой тип вызова (cdecl / stdcall) используется в dll?
Сергей М. (2008-02-19 13:55:00) [20]
> из экспортного pas'a
Не из экспортного, а из импортного.
Ну и где здесь stdcall ?