Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Делись ссылками с других ресурсов. Теперь они имеют описание!
Вадим
700
Вадим 2010.04.05 13:59 

Подскажите, плз, как грамотно оформлять DLL в BC++, что бы они воспринимались MT5.

Rashid Umarov
Админ
11706
Andrey Emelyanov
1355
Andrey Emelyanov 2010.04.05 14:59  
Rinng писал(а)  :

Подскажите, плз, как грамотно оформлять DLL в BC++, что бы они воспринимались MT5.

На данную тематику есть очень хорошая книга "Windows. Создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows." Дж. Рихтер - в ней (если четвертое издание) главы 19, 20.

Так же не поленись посмотреть http://www.rsdn.ru/ - хороший портал для программистов.

Вадим
700
Вадим 2010.04.05 15:43  
Угу, смотрел, и комент свой там оставил.
Вадим
700
Вадим 2010.04.05 16:00  

Хех, меня интересует сейчас простой пример описания функции в BC++, типа :

 double Summator ( double X, double Y)
             {
               return (X+Y);

             }

Но заточенной для BC++ и которую воспринимает MT5. И какие типы  DLL воспринимает MT5, а какие нет?

 

 

Alexander
1510
Alexander 2010.04.05 16:29  
а разве это не с билдера окошко?
MetaQuotes
Админ
24887
Renat Fatkhullin 2010.04.05 16:42  
Rinng:

Но заточенной для BC++ и которую воспринимает MT5. И какие типы  DLL воспринимает MT5, а какие нет?

Правильнее будет говорить не о типах DLL, а о соглашениях о связях. Как я рассказал в статье, MQL5 поддерживает 2 основных метода вызова cdecl и stdcall:

В вызовах функций MQL5 используется соглашение о связях __stdcall и __cdecl. Хотя вызовы stdcall и cdecl отличаются вариантами извлечения параметров со стека, но исполняющая среда MQL5 позволяет безболезненно использовать оба варианта за счет специального враппера DLL вызовов.

Попробуйте VC++ Style DLL.
Вадим
700
Вадим 2010.04.05 16:57  

GarF1eld:
а разве это не с билдера окошко? 

Окошко из С++Builder 6.0.
Вадим
700
Вадим 2010.04.05 17:03  
Renat:

Правильнее будет говорить не о типах DLL, а о соглашениях о связях. Как я рассказал в статье, MQL5 поддерживает 2 основных метода вызова cdecl и stdcall:

Попробуйте VC++ Style DLL.
О связях я в курсе. Спрашу иначе -  такая установка фложков в С++Builder 6.0 нормально будет создавать  DLL для MT5?
Andrey Emelyanov
1355
Andrey Emelyanov 2010.04.05 17:08  
Rinng:

Хех, меня интересует сейчас простой пример описания функции в 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 корректно выгружалась и высвобождала используемую память.





Вадим
700
Вадим 2010.04.05 17:39  

nav_soft , в общем понятно. А это код в стиле MS или Borland?

/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий