Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

При вызове функции из dll параметры меняются местами... [D7, Win95/98]


Kolan ©   (2005-06-30 12:18:00) 

Здравствуйте,
 Такая вот проблемма. Есть ф-ция она находится в 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.

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


Kolan   (2005-06-30 14:02:00) [1]

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


Digitman   (2005-06-30 13:05:00) [2]


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


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


Digitman   (2005-06-30 13:00:00) [3]


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


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

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


Kolan   (2005-06-30 12:54:00) [4]


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


Digitman   (2005-06-30 12:29:00) [5]


> stdcall забыл


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


Kolan   (2005-06-30 12:27:00) [6]

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


Poirot   (2005-06-30 12:21:00) [7]

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


Гаврила   (2005-06-30 12:19:00) [8]

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


Digitman   (2005-06-30 12:19:00) [9]

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


Наверх

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