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

 

Да в том-то и дело, что скрипт просто вылетал, как после этого смотреть код ошибки? Или при следующем запуске его можно сразу считать?

В принципе, проблема решилась компиляцией dll под 64x. Правда, потом уже пошли другие ошибки, но это уже не важно, мне нужно было понять, как вообще собирать и линковать библиотеки на c/с++ к mql5. Свой пример сейчас работает нормально.

 
Будет ли обновление статьи? Появились ли какие-нибудь изменения в работе с dll?
 

Если у Вас стоит студия 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 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 

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