Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];

Вниз

При вызове функции из 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.037 c
1-1120124715
PIF
2005-06-30 13:45
2005.07.18
оператор case


11-1103222043
DmiSb
2004-12-16 21:34
2005.07.18
ImageList с другой формы


14-1119643959
SergP
2005-06-25 00:12
2005.07.18
Где можно бесплатно скачать mp3?


1-1119693968
Duck
2005-06-25 14:06
2005.07.18
Освобождение памяти


1-1120325184
Hamsterman
2005-07-02 21:26
2005.07.18
Автозаполнение HTML-форм





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский