__declspec(dllexport) void __stdcall Create( int x );
Кстати в папке \experts\samples\DLLSample\ лежит пример dll, экспортирующей функции.
Попробуй
__declspec(dllexport) void __stdcall Create( int x );
Кстати в папке \experts\samples\DLLSample\ лежит пример dll, экспортирующей
функции.
Пробовал скомпилять этот сэмпл - один фиг - вызывает DllMain 4 раза и все. Остальные не вызываются.
ЗЫ:
Самое интересное, что вызов работает, если написать __cdecl, но только если функция без параметров, если хотя бы один параметр, то все, терминал падает.
У меня была точно такая же проблема как у вас.
Не мог ни как подобрать директивы с которыми нужно объявлять функцию в Dll на экспорт, оказалось нужно так:
extern "C" __declspec(dllexport) void __stdcall Create(const int x );
причем для корректной работы всех функций в проект нужно добавить файл *.def и в нем прописать имена экспортируемых функций еще раз
то есть если у вас есть набор функций, в файле MyDll.cpp:
extern "C" __declspec(dllexport) void __stdcall SendResultInt(const int CommandId, const int Value);
extern "C" __declspec(dllexport) void __stdcall SendResultDouble(const int CommandId, const double Value);
extern "C" __declspec(dllexport) void __stdcall SendResultString(const int CommandId, const char* Value);
extern "C" __declspec(dllexport) void __stdcall SendResultDateTime(const int CommandId, const long Value);
extern "C" __declspec(dllexport) void __stdcall SendResultColor(const int CommandId, const int Value);
extern "C" __declspec(dllexport) void __stdcall SendResultBool(const int CommandId, const bool Value);
то вам нужно в проекте создать файл MyDll.def и в нем прописать:
EXPORTS
SendResultInt
SendResultDouble
SendResultString
SendResultDateTime
SendResultColor
SendResultBool
Соответственно в mq4 подключать нужно
#import "MetaInterface.dll"
void SendResultInt(int CommandId, int Value);
void SendResultDouble(int CommandId, double Value);
void SendResultString(int CommandId, string Value);
void SendResultDateTime(int CommandId, datetime Value);
void SendResultColor(int CommandId, int Value);
void SendResultBool(int CommandId, bool Value);
Это связано с тем что у MetaTrader'а достаточно примитивная система вызова функций из динамических библиотек, и если имя экспортной функции в dll файле будет "_SendResultInt@8" он его не узнает.
Поэтому мы как бы в явном виде задаем имена, строго "SendResultInt". Соглашение вызова должно быть stdcall.
И все будет работать :)
Рекомендую просто изучить пример experts\samples\DLLSample\ExpertSample который обычно прилагается к мета трейдеру 4
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Пробовал так:
extern "C" __declspec(dllexport) void __cdec Create( int x );
сначала выпоняет функцию, делает все как надо, а после выхода из функции - терминал падает (чтение недопустимой области памяти).
Если вместо __cdecl использовать __stdcall или __fastcall - функция вообще не вызывается,
аналогично, не вызывается если не писать extern "C" или __declspec(dllexport).
ЗЫ: в мт4 пишу:
#import "my.dll"
int Create( int );
#import
Спасибо.