Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача PDouble в dll, компилированную в Билдере [D7, XP]


Страницы:   1 2

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 ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо