Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Совершил прорыв? Напиши статью об этом и получи 200 USD!
Michael
11
Michael 2007.11.24 21:45 
Как правильно обьявлять функцию внутри DLL?

Пробовал так:
extern "C" __declspec(dllexport) void __cdec Create( int x );

сначала выпоняет функцию, делает все как надо, а после выхода из функции - терминал падает (чтение недопустимой области памяти).
Если вместо __cdecl использовать __stdcall или __fastcall - функция вообще не вызывается,
аналогично, не вызывается если не писать extern "C" или __declspec(dllexport).

ЗЫ: в мт4 пишу:

#import "my.dll"
int Create( int );
#import


Спасибо.
Alexey Lopatin
28549
Alexey Lopatin 2007.11.24 22:02  
Попробуй
__declspec(dllexport) void __stdcall Create( int x );
Кстати в папке \experts\samples\DLLSample\ лежит пример dll, экспортирующей функции.
Michael
11
Michael 2007.11.24 22:43  
Luptator:
Попробуй

__declspec(dllexport) void __stdcall Create( int x );

Кстати в папке \experts\samples\DLLSample\ лежит пример dll, экспортирующей
функции.





Пробовал скомпилять этот сэмпл - один фиг - вызывает DllMain 4 раза и все. Остальные не вызываются.

ЗЫ:

Самое интересное, что вызов работает, если написать __cdecl, но только если функция без параметров, если хотя бы один параметр, то все, терминал падает.
Alexey Lopatin
28549
Alexey Lopatin 2007.11.25 10:47  
А чем ты компилируешь?
Michael
11
Michael 2007.11.25 15:03  
Luptator:
А чем ты компилируешь?



Microsoft Visual Studio 2003/ 2005
Михаил
31
Михаил 2011.04.05 18:50  

У меня была точно такая же проблема как у вас.

Не мог ни как подобрать директивы с которыми нужно объявлять функцию в 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

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