Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: 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 вся ветка

Текущий архив: 2005.07.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.033 c
1-1119852787
anarhi
2005-06-27 10:13
2005.07.18
stringgrid


14-1119350268
Xmen
2005-06-21 14:37
2005.07.18
Лицензионная программа


1-1120317333
Brack
2005-07-02 19:15
2005.07.18
Как програмно вывести N обьектов


3-1118138638
ElenaPetra
2005-06-07 14:03
2005.07.18
Хранение Excel-файлов в бд SQL.


14-1119789328
Chuvak
2005-06-26 16:35
2005.07.18
DVD+-RW?