Matlab Dll c++ VS2008 MT5 windows 7 не работает

 

Уважаемые господа.

 

Имеется Matlab R2010a 32bit, VisualStudio 2008 sp1, MT5, Windows 7 64bit

 

В матлабе:

1. Пишу простую m функцию которая возвращает результат

 function s = sinus()
s = sin(2);
end
 

2. Start > Matlab > MatlabCompiler > Deployment Tool

3. Target устанавливаю "C++ Shared Library", пишу название проекта dll_test, жму ОК.

4. Появляется окошко Deployment tool справа - в Exported Functions тащу sinus.m

 

5. Перед тем как нажать  Build отключаю vpn соединение интернет (это официальный глюк матлаба в win7/vista - эту мантру

надо делать перед установкой, входом в матлаб, перед компиляцей и как я понял перед запуском стэнделон

приложения - не знаю насчет dll - после интернет можно снова включить)

 

6. Так же выполняю команду mbuild -setup - она выставляет текущий компилятор - выбираю микрософтовский компилятор. 

 

7. Build > имеем 4 файла >  dll_test.dll,   dll_test.h,   dll_test.lib   и ткстшник его игнорируем.

 

 8. Dll с функцией матлаба готова.

 

 

В Visual Studio 2008 

 

1. File >  New > Project > MFC Dll

2. Имя проекта matlab_dll_wrapper > OK

 

3. Содержимое matlab_dll_wrapper.def

 

 ; matlab_dll_wrapper.def : Declares the module parameters for the DLL.

LIBRARY "matlab_dll_wrapper"

EXPORTS
; Explicit exports can go here
Hello

 


4.  Содержимое matlab_dll_wrapper.cpp

 

 // matlab_dll_wrapper.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include "matlab_dll_wrapper.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define _DLLAPI extern "C" __declspec(dllexport)



_DLLAPI double __stdcall Hello(double a, double b)
{
  return a + b;
}

5. аутпут ставлю в папку с mql5, это выставляю   matlab_dll_wrapper > Properties > Configuration Properties > General > Output Directory > C:\Program Files (x86)\MetaTrader 5\MQL5\Libraries

6. Компилю Release Win32 - кнопкой (f7)  > Итого по вышеобозначенному адресу появились следующие 4 файла:    matlab_dll_wrapper  .dll / .exp / .lib / .pdb

  

 Иду в метатрейдер запускаю редактор 

 

#import "matlab_dll_wrapper.dll"
double Hello(double a, double b);
#import
 

void OnInit()
{

double a = 1.5;
double b = 1.5;

Print("а плюс б =", Hello (a, b));

 

Компилирую - f5 > присоединяю к графику

 

Чудесно! Всё работает. Выводится сообщение  а плюс б = 3

 

 

Вот, а теперь тоже самое с функцией матлаба

 

В Visual Studio

 

1. Копирую 3 matlab файла(.dll .lib .h)  в папку с VS проектом там где def cpp и прочее...

 корректирую приведенный выше код

 

2. matlab_dll_wrapper.cpp

 

 // matlab_dll_wrapper.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include "matlab_dll_wrapper.h"
#include "dll_test.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define _DLLAPI extern "C" __declspec(dllexport)



_DLLAPI double __stdcall Hello(double a, double b)
{
//дальше как я это понимаю происходит следующее...


 if(mclInitializeApplication(NULL,0) == 0) //открываем matlab compilator runtime
{
//std::cerr << "Could not initialize MCR" << std::endl;
return -2;
}

 if (dll_testInitialize() == 0) // открываем нашу чудо длл из матлаба
{
//fprintf(stderr,"Could not initialize the library.\n");
return -3;
}
 else // если открылось
{
  int z = 1; // инициализируем аутпут
  mwArray zz(0); // пишем аутпут сюда

  sinus(z, zz); // вызываем многострадальный синус

  dll_testTerminate(); // закрываем длл
}

 mclTerminateApplication(); //закрываем matlab compilator runtime

 return a + b; // но возвращаем по-прежнему все по старому просто чтобы убедится что работает
}

 

 3. Проект > properties >  C/C++ > General > Additional Include Directories = C:\MATLAB\R2010a\extern\include

 4. Проект > properties >  Linker > General > Additional Library Directories = C:\MATLAB\R2010a\extern\lib\win32\microsoft

5.   Проект > properties >  Linker > Input > Additional Dependencies > libemlrt.lib libeng.lib libfixedpoint.lib libmat.lib libmex.lib libmwblas.lib libmwblascompat32.lib libmwlapack.lib libmwmathutil.lib libmwservices.lib libmwsl_fileio.lib libmwsl_solver_rtw.lib libmx.lib libut.lib mclcommain.lib mclmcr.lib mclmcrrt.lib mclxlmain.lib ne_mli.lib ne_rtl.lib physmod_foundation_util.lib rtwcg.lib dll_test.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

тут видимо я переборщил подключив все советы которые нашел в интернете

6. Поставил Matlab Compilator Runtime я правда не уверен надо это делать для dll или нет. Скопировал в корень его установки mclmcrrt713.dll - иначе почему экзешники скомпиленные из матлаба не пашут.

 7.  Похоже, что всё - скомпилил - захожу в метатрейдер и что вы думаете - не пашет - ругается 

2010.05.16 20:42:10 cindyrellaIndicator (EURUSD,M1) Cannot find 'Hello' in 'matlab_dll_wrapper.dll'
2010.05.16 20:42:11 cindyrellaIndicator (EURUSD,M1) Cannot open 'C:\Program Files (x86)\MetaTrader 5\MQL5\Libraries\matlab_dll_wrapper.dll' (126)

 

Вот, если закомментить матлабовский кусок

 

_DLLAPI double __stdcall Hello(double a, double b)
{
//дальше как я это понимаю происходит следующее...


 if(mclInitializeApplication(NULL,0) == 0) //открываем matlab compilator runtime
{
//std::cerr << "Could not initialize MCR" << std::endl;
return -2;
}

// if (dll_testInitialize() == 0) // открываем нашу чудо длл из матлаба
  //{
  ////fprintf(stderr,"Could not initialize the library.\n");
  //return -3;
  //}
 //else // если открылось
  //{
  //int z = 1; // инициализируем аутпут
 // mwArray zz(0); // пишем аутпут сюда
//
 // sinus(z, zz); // вызываем многострадальный синус

 // dll_testTerminate(); // закрываем длл
  //}

 mclTerminateApplication(); //закрываем matlab compilator runtime

 return a + b; // но возвращаем по-прежнему все по старому просто чтобы убедится что работает
}

 

то все работает - раскомментить - не работает. Пробовал подключать отключать vpn - пофиг. Запустил метатрейдер с администраторскими правами - тоже не помогло.

 

Подскажите пожалуйста кто знает - в чём мой косяк? 

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки - Документация по MQL5
 

По всей видимости, терминал не видит dll матлаба, похоже, что они хранятся не в стандартных папках Винды.

Попробуйте дописать переменную окружения (среды) path путями к этим библиотекам.


 
mql5 писал(а)  :

По всей видимости, терминал не видит dll матлаба, похоже, что они хранятся не в стандартных папках Винды.

Попробуйте дописать переменную окружения (среды) path путями к этим библиотекам.


О да! Заработало - это ж просто прекрасно, спасибо большое.

 

Небольшая ремарка, может поможет кому то - после запуска со включенным интернетом через vpn соединение и подключенным советником с матлабовской длл терминал начинает потреблять 50% ресурсов и ничего не происходит. Такая же ситуация как и у стендэлон приложений матлаба - глюк. Надо отключить vpn, запустить метатрейдер присоединить советник/индикатор с матлаб длл и только после этого включить инет снова. Тогда работает. Видимо решение это сменить тип соединения с инетом.

Причина обращения: