Скачать MetaTrader 5

Переносим алгоритм советника в DLL - страница 3

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

"__stdcall" нужно ставить обязательно. Это без вариантов.
А чтобы компилятор не искажал имена функций нужно сделать такой def-файл:

EXPORTS
        GetDouble
        GetZero

И подключить его в опциях проекта:
Linker->Input->Module_Definition_File "MyDefFile.def"

 

andreybs
609
andreybs  

Пробовал в VC++ директиву __cdecl . При таком объявлении функций

extern "C" double __declspec(dllexport) __cdecl GetDouble(double val)
extern "C" double __declspec(dllexport) __cdecl GetZero()


их экспортируемые имена не меняются. Однако, вызов GetZero срабатывает нормально, а GetDouble крашит и закрывает терминал. Проблема передачи параметров функции. Как решить проблему - не ясно.

andreybs
609
andreybs  
Ko1dun:

И подключить его в опциях проекта:
Linker->Input->Module_Definition_File "MyDefFile.def"


Не вижу я этого в VC++ 2010
Koldun Zloy
283
Koldun Zloy  
andreybs:

Не вижу я этого в VC++ 2010

Ну извини, у меня 2008 студия.

Попробуй просто включить файл в проект.

andreybs
609
andreybs  
andreybs:

Не вижу я этого в VC++ 2010

Нашел. Вставил. DLL не компилируется

1>D:\Forex\TendAnalyzer\Debug\TendAnalyzer.lib : fatal error LNK1120: 1 неразрешенных внешних элементов

Наверное, как то по другому нужно его подключать.
Koldun Zloy
283
Koldun Zloy  

Какое-то имя функции в def-файле не соответствует имени в cpp-файле.

andreybs
609
andreybs  

УРА!

добавил в линкер в явном виде /DEF:"путь до .def файла" и все получилось! Имена не искажаются компилятором при экспорте и в терминале все работает!


Ko1dun, спасибо!

Koldun Zloy
283
Koldun Zloy  
Ko1dun, спасибо!


На здоровье.

Vladimir Khlystov
14343
Vladimir Khlystov  
andreybs:

УРА!

добавил в линкер в явном виде /DEF:"путь до .def файла" и все получилось! Имена не искажаются компилятором при экспорте и в терминале все работает!


Ko1dun, спасибо!



Окончательный вариант VC проекта можете выложить?
Комбинатор
16598
Комбинатор  
alsu:

работает, потому что это единственно верное объявление. Соответственно, и вторая функция должна быть объявлена таким же образом.

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