Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.16;
Скачать: CL | DM;

Вниз

Передача 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"a
function 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.019 c
15-1202490749
Пробегал...
2008-02-08 20:12
2008.03.16
Компилятор выбрасывает условие


10-1144054706
alol
2006-04-03 12:58
2008.03.16
колонтитулы в Word


2-1203489542
allucard
2008-02-20 09:39
2008.03.16
Изменение событий


2-1203008491
Квэнди
2008-02-14 20:01
2008.03.16
3DES в Delphi


11-1185293436
Dy1
2007-07-24 20:10
2008.03.16
колонки ListView