Обсуждение статьи "Как за 10 минут написать DLL библиотеку для MQL5 и обмениваться данными?" - страница 13

 

Привет,

Спасибо за вашу отличную работу!

Поскольку я новичок в этой области, я буду очень рад, если вы скажете мне, поможет ли мне эта DLL или нет?

Я хочу экспортировать данные (онлайн) из MT5 в мое приложение на C++, сделать на них анализ, а затем отправить результат в виде команд покупки/продажи в MT5 из моего приложения. Не могли бы вы подсказать мне, как я могу достичь этой цели?

 

Если у Вас стоит студия 2017, Вы смотрите эту инструкцию для старой студии и не сращиваете что и как делать, то рекомендую сначала прочесть вот эту статью: https://docs.microsoft.com/ru-ru/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=vs-2017

Затем, когда Вы уже создали свою dll по образу и подобию примера из приведённой статьи и протестили её на клиентском приложении, читайте эту инструкцию, начиная с пункта 2, со слов "а в MQL5 программе описываться и вызываться так:". То есть объявляйте свою dll в mt5 как там написано.

Я решил свою проблему именно так. 

 

Хотелось бы список соотношения типов между С++ и MQL в виде макросов. 

#define MQL_STRING wchar_t
 
@Renat Fatkhullin, нужен пример по изменению размера массива и строк в DLL. Через realloc() это делать или можно переданные данные не освобождать, а просто сменить указатель на новый массив данных?
 
Отлично, спасибо большое, отлично работает с Visual Studio 2017 Community Edition
 

 Вот мой код на с++ Visual Studio 2012. Файл main. с расширением cpp (main.сср)

#define MT4_EXPFUNC __declspec(dllexport) создал макрос чтобы не писать запись __declspec(dllexport)int __stdcall add(int a=0, int b=0)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)и так пробовал тоже
MT4_EXPFUNC int __cdecl add(int a=0, int b=0)//stdcall данная примитивная функция ничего не делает а просто возвращает значение 18
{return (18);пробовал так return 18;}

Далее создал файл с main расширением def (main.def) который имеет список экспортируемых функций, выглядит код так :

LIBRARY "dllmt42"
EXPORTS
add

Далее в компиляторе произвёл импорт 

#import "dllmt42.dll"
int _add(int a=0, int b=0);
#import

Компилируется проблем нет, но когда бросаешь советника на график вылазит бяка 

unresolved import function call, find '_add' in 'dllmt42.dll'. Total Comander функцию видит как и сам компилятор при перетаскивании файла 

Кто может помочь, как решить проблему с ошибкой, как никак есть файл с расширением .def, который хранит и отвечает за корректный экспорт функций?


 
Seric29:

 Вот мой код на с++ Visual Studio 2012. Файл main. с расширением cpp (main.сср)

Далее создал файл с main расширением def (main.def) который имеет список экспортируемых функций, выглядит код так :

Далее в компиляторе произвёл импорт 

Компилируется проблем нет, но когда бросаешь советника на график вылазит бяка 

unresolved import function call, find '_add' in 'dllmt42.dll'. Total Comander функцию видит как и сам компилятор при перетаскивании файла 

Кто может помочь, как решить проблему с ошибкой, как никак есть файл с расширением .def, который хранит и отвечает за корректный экспорт функций?


extern "C" надо добавлять и к декларациям и к имплементациям экспортируемых функций, раз уж тут C++. Иначе сигнатуры входов получаются "плюсовые" и MT (как и все) их не увидит.

 
Maxim Kuznetsov:

extern "C" надо добавлять и к декларациям и к имплементациям экспортируемых функций, раз уж тут C++. Иначе сигнатуры входов получаются "плюсовые" и MT (как и все) их не увидит.

ну дописал я так 

#define MT4_EXPFUNC extern "C" __declspec(dllexport)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)
MT4_EXPFUNC int __cdecl add(int a=0, int b=0)//stdcall
{
    return (18);
}

И всё равно тоже самое - unresolved import function call, find '_add' in 'dllmt42.dll'.. Т.е. нужен чистый С без ++?

 
Файл .def не нужен вообще. Нужно в MQL дублировать функции в секции #import 
 
Roffild:
Файл .def не нужен вообще. Нужно в MQL дублировать функции в секции #import 

Ну да и без него делали видел я и такое, у меня не идёт, ну покажите что там дублировать наставьте уже на путь истинный?