Вниз
Скачать: CL | DM;

При вызове функции из dll параметры меняются местами...   Найти похожие ветки 

← →
Kolan ©   (2005-06-30 12:18) [0]

Здравствуйте,
 Такая вот проблемма. Есть ф-ция она находится в dll.

function EvalCapacityKoeff(ResonanceFrequency,
     AntiResonanceFrequency: Double;
     QualityFactor: Double; var Error: Boolean): Double;
var
 Numerator, Denominator: Double;
 B: Double;
begin
 Error := False;
 try
   B := AntiResonanceFrequency / ResonanceFrequency;
   Numerator := Sqrt(1 + (4/(QualityFactor*QualityFactor)));
   Denominator := (B * B) - 1;
   Result := Numerator / Denominator;
 except
   Error := True;
 end;
end;


При её вызове происходит удивительная вешь - параметры меняются местами.

Те при вызове
CapacityKoeff := EvalCapacityKoeff(OutPutResAntiRes[0,0],
     OutPutResAntiRes[1,0], QualityFactor, Error);


Параметры такие: (10540, 10770, 2,299). А попадая в dll они такие: (2,299, 10770, 10540). Причем такой "эффект" наблюдается и для других функций из dll.

Для проверки скопировал обявление и саму функцию в главную программу - все нормально (те правильно передалось). Ума не приложу в чем дело.


← →
Гаврила ©   (2005-06-30 12:19) [1]

Смотри соглашения о вызовах (stdcall и прочие)
они должны совпадать при объявлении функции в DLL и в хосте


← →
Digitman ©   (2005-06-30 12:19) [2]

нарушено соответствие соглашений о вызове ф-ции в вызывающем и вызываемом коде


← →
Poirot ©   (2005-06-30 12:21) [3]

Проблема ИМХО в соглашениях о вызовах - calling conversions...


← →
Kolan ©   (2005-06-30 12:27) [4]

Благодарю очень выручили. Просто обявления написал, а сами фкункции скопировал из старого проекта, ну и stdcall забыл везде поставить. :)))


← →
Digitman ©   (2005-06-30 12:29) [5]


> stdcall забыл


а нашута тебе stdcall ?
в перспективе - использование твоей dll в с-шных программах ?


← →
Kolan ©   (2005-06-30 12:54) [6]


> Digitman ©   (30.06.05 12:29) [5]
Вобщето нет. А что есть большая разница. Если да то в чем? В скорости? Тогда что лучьше использовать?


← →
Digitman ©   (2005-06-30 13:00) [7]


> Kolan ©   (30.06.05 12:54) [6]


соглашение stdcall подразумевает передачу параметров исключительно через стек, в то время как при дифолт-соглашении первые три явных параметра (считая слева направо) Делфи-компилятор передает через РОНы eax, edx, ecx

обращение к стеку - это обращение к памяти, что менее производительно, нежели обращение к РОН


← →
Digitman ©   (2005-06-30 13:05) [8]


> что лучьше использовать?


с учетом [6] лучше явно не указывать соглашение (т.е. использовать дифолт-соглашение)


← →
Kolan ©   (2005-06-30 14:02) [9]

Благодарю буду знать.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.027 c
3-1117991302
dim2002
2005-06-05 21:08
2005.07.18
Сортировка в ADO


5-1090750591
P.N.P.
2004-07-25 14:16
2005.07.18
PropertyEditor


1-1120017441
Alex_K
2005-06-29 07:57
2005.07.18
Объявление переменной во время работы проги.


6-1113234607
Wistful
2005-04-11 19:50
2005.07.18
почтовый сервер


4-1116593693
Rius
2005-05-20 16:54
2005.07.18
Панели групп как в Windows Explorer через MS Visual Styles API ?




   Наверх