Подскажите, плз, как грамотно оформлять DLL в BC++, что бы они воспринимались MT5.
На данную тематику есть очень хорошая книга "Windows. Создание эффективных Win32-приложений с учетом специфики
64-разрядной версии Windows." Дж. Рихтер - в ней (если четвертое издание) главы 19, 20.
Так же не поленись посмотреть http://www.rsdn.ru/ - хороший портал для программистов.
Хех, меня интересует сейчас простой пример описания функции в BC++, типа :
double Summator ( double X, double Y)
{
return (X+Y);
}
Но заточенной для BC++ и которую воспринимает MT5. И какие типы DLL воспринимает MT5, а какие нет?
Но заточенной для BC++ и которую воспринимает MT5. И какие типы DLL воспринимает MT5, а какие нет?
Правильнее будет говорить не о типах DLL, а о соглашениях о связях. Как я рассказал в статье, MQL5 поддерживает 2 основных метода вызова cdecl и stdcall:
В вызовах функций MQL5 используется соглашение о связях __stdcall и __cdecl. Хотя вызовы stdcall и cdecl отличаются вариантами извлечения параметров со стека, но исполняющая среда MQL5 позволяет безболезненно использовать оба варианта за счет специального враппера DLL вызовов.
GarF1eld:
а разве это не с билдера окошко?
Правильнее будет говорить не о типах DLL, а о соглашениях о связях. Как я рассказал в статье, MQL5 поддерживает 2 основных метода вызова cdecl и stdcall:
Хех, меня интересует сейчас простой пример описания функции в BC++, типа :
double Summator ( double X, double Y)
{
return (X+Y);
}
Но заточенной для BC++ и которую воспринимает MT5. И какие типы DLL воспринимает MT5, а какие нет?
1. Хочешь чтоб Твою DLL понимали другие программы написанные на отличных от BC++ языках вплоть до машинного - ЭТО НИКАКИХ КЛАССОВ! У каждого компилятора своя уникальная структура для хранения этих объектов. Снять галку с Use VCL
2. Галку с Multi Theaded снять! Причина та же, нужна многозадачность добро пожаловать в критические секции кода. Не помогут... тогда решай вопрос "своими руками" - делая многопоточную библиотеку от А до Я (имеется в виду не используя стандартные библиотеки С/С++), либо придется объяснять программе которая будет вызывать твою DLL о существовании структуры _tiddata . "Дешевле будет" воспользоваться критическими секциями....
3. Создание и включение в проект файла с расширением DEF!!! Не будет его - BC придумает "уникальнейшее имя" для Summator(Типа: _Summatorab) при этом не уведомив тебя об этом! Из чего состоит DEF:
LIBRARY <NAME_DLL>
EXPORTS
Summator
4. Определение функции не верно! Объявлять и определять надо так:
#include <windows.h> // без неё любой проект никак не работает!
//...
extern "C" __declspec(dllexport) bool __stdcall Summator(double X, double Y);
//...
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH:
//тут сделали свои дела при запуске Dll
case DLL_PROCESS_DETACH:
//тут сделали свои дела при выгрузке Dll
}
return 1;
}
//...
double __stdcall Summator( double X, double Y)
{
return (X+Y);
}
В отличии от MT 4, MT 5 не допускает невыгрузку Dll из адресного пространства своего процесса после окончания работы скрипта/индикатора/советника - других ограничений пока не видел... сделай все чтоб твоя Dll корректно выгружалась и высвобождала используемую память.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Подскажите, плз, как грамотно оформлять DLL в BC++, что бы они воспринимались MT5.