Главная страница
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.031 c
9-1112387548
Green_Templar
2005-04-02 00:32
2005.07.18
dxdraw1.fillrect


3-1117804272
RavenD
2005-06-03 17:11
2005.07.18
BCD, Float или что то ещё?


6-1113123235
Петя Иванов
2005-04-10 12:53
2005.07.18
загрузка страницы в браузере


14-1119676905
Бухало)))
2005-06-25 09:21
2005.07.18
Алкоголь


1-1120153587
Michael5
2005-06-30 21:46
2005.07.18
Как заполнить StringGrid данными из файла Excel?