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