![]() |
| ||
|
|
Новости |
Поиск |
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 на том же адресе)
Вопрос: В чем может быть решение ?
Заранее спасибо
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^;