Отладка прог MetaTrader 4 с помощю Microsoft Visual C++ 2010 Express. - страница 3

 

Спасибо! Я по частям. создаю проект с помощью визуал студии. Проэкт

Дальше, я из этого проекта копирую DLLproect.dll и помещаю ее в папку libraries метатрайдера.

Код робота

//+------------------------------------------------------------------+
//|                                                    NowiyDLL .mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#import "DLLproect.dll"
int  fnCalculateSpeed(int &res1,double &res2);
#import


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   int    speed=0;
   int    res_int=0;
   double res_double=0.0;

   speed=fnCalculateSpeed(res_int,res_double);
   Print("Time ",speed," msec, int: ",res_int," double: ",res_double);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

Все компилируется. Но результата нету, точнее

2013.12.16 16:23:57 NowiyDLL USDCHF,M5: cannot call function 'fnCalculateSpeed' from dll 'DLLproect.dll' (error 127)

Чем дополнить проект, или что куда вставить, или что? как интересно!!


 

Да. Читаю

- Да дефа нет я так и не нашол как его создать

Правой кнопкой на проекте --> Add --> New Item --> Visual C++ --> Module definition file (.def).

Если добавлять ручками существующий, не прокатит, надо именно создавать студией.

-Как это будет, по-русски?

     
    Я понимаю, что это как бы модулем управляющий файл, тут и думать нечего. Но у меня в визуал студии кажется нет такого.
     

    Добавил блокнотом в проект и перестроил его. Что означает этот минус? Уверен, что ничего не вышло.

    Пишут, что файл def ну должен быть. Почему он не появляется в проекте сам?

     

    Наверное Вы меня игнорируете

    220Volt:

    1. Проект компилируется? Без ошибок? Если да, то установите выходной каталог в известное вам место, ничего искать не придется (описано в статье выше).

    2. Вы должны получить файл.dll для импорта его функций в MT. Для импорта функций из него в мета эдиторе пишем:

    3. dll - не exe, exe запускается руками в ней есть стартовая функция, dll используется другой программой (exe).

    4. если решили использовать __stdcall , то есть особенности, даже если напишите extern "C" имя будет изменяться (в таблице экспорта), если не ошибаюсь - будет добавлено @<размер параметров> в конец имени. Либо смотреть имя при помощи различных утилит (например dumpbin), либо поиском через блокнот, либо сделать для проекта .def файл (его пример есть в MT\experts\samples\DLLSample). Мало просто кинуть def файл в папку с проектом (к .h и .cpp файлам) еще нужно отразить это в настройках проекта: свойства проекта/компоновщик/ввод/файл определения модуля.

    5. Кое-что писал здесь: https://www.mql5.com/ru/forum/140601/page6

     

    Извините!!! Я доопределяюсь с терминологией всего.

    Так, снова по частям. Файл файл.dll из проекта я нашол, скопировал и добавил в папку либрариес, а в проекте он остался. Правильно?

     

    Попробуйте сделать все в точности как я написал:

    1. В одном из .cpp файлов пишите

    #include <windows.h>
    
    void __stdcall fn(char *str) 
    {
       MessageBoxA(NULL, str, "", MB_OK);
    }

    2. Создаете файл блокнотом и вписываете

    LIBRARY <Имя вашей dll без скобок, пример: my_lib>
    
    EXPORTS fn
    

    Меняете расширение на .def, кидаете его к .cpp и .h проекта. Добавляете файл в обзор проекта (слева, где отображаются файлы в студии). Вписывайте имя вашего def файла в: свойства проекта/компоновщик/ввод/файл определения модуля.

    3. Компилируйте, .dll должна оказаться в MT\experts\libraries.

    4. Создаете скрипт с кодом

    #import "<имя вашей dll>.dll"
    
    void fn(string var);
    
    
    int start()
      {
    //----
       fn("Hello dll");
    //----
       return(0);
      }

    5. Никакого творчества !!!

     
    Спасибо!!!!!!!!!!!
     
    Заработало?
     

    Вот, кстати, ещё особенность новых билдов MT4 : DLL-ки можно компилировать (не отлаживать) прямо в метаэдиторе.

    // При условии наличия на компе вижуал-студии. Её метаэдитор обнаруживает при загрузке.

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