Главная страница
    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.46 MB
Время: 0.04 c
14-1119547570
Olivka
2005-06-23 21:26
2005.07.18
Сколько стоит программа


3-1118053025
SoLRoN
2005-06-06 14:17
2005.07.18
Сохранение данных текстовый файл...


1-1120204747
kyn66
2005-07-01 11:59
2005.07.18
Как подставить путь к имени таблицы?


14-1119607278
boriskb
2005-06-24 14:01
2005.07.18
Экономим на зарплатах?


14-1119443440
Магнум
2005-06-22 16:30
2005.07.18
Windows Task Manager в Windows XP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский