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 на том же адресе)

Вопрос: В чем может быть решение ?
Заранее спасибо


Running man (aka Stunt)   (2008-02-19 13:51:00) [21]

>oxffff ©   (19.02.08 13:49) [4]
вылазит AV на адресе 00000


oxffff   (2008-02-19 13:51:00) [22]


> не помогает (эффект AV на том же адресе)


см. [2]


oxffff   (2008-02-19 13:49:00) [23]


> 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;


Running man (aka Stunt)   (2008-02-19 13:48:00) [24]

>Сергей М. ©   (19.02.08 13:41) [2]
Вот обертка из экспортного pas'a
function Analog_FreqGen_SetFrequency(Index: DWORD; Frequency: PDouble) : DWORD; external 'AnalogHAL.dll' index 16;


Сергей М.   (2008-02-19 13:41:00) [25]


> В чем может быть решение ?


В соблюдении соглашения о вызове.


Running man   (2008-02-19 13:40:00) [26]

Сорри, поправка:
FFrStaticMEasured:=PDValue^;


Страницы:   1 2

Наверх

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