Скачать MetaTrader 5

mql4 dll c++

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Статьи помогут закрепить твои знания. Заходи и читай!
Apelsin
395
Apelsin 2016.07.07 18:49 

Здравствуйте.

Кто разобрался с DLL подскажите пожалуйста в чем проблема.

Есть два файла на С++.

Первый

/* libfire.h */
#ifdef LIBFILE_EXPORT
#define LIBFILE_API __declspec(dllexport)
#else
#define LIBFILE_API __declspec(dllimport)
#endif
 
extern "C" {
 
    LIBFILE_API void __stdcall Fire(double inarray[10], double outarray[10]);
 
}


Второй


 
/* libfire.cpp */
#define LIBFILE_EXPORT
#include "libfire.h"
 
void  __stdcall Fire(double inarray[10], double outarray[10])
{


 outarray[1] = 5 ;
              
}


И индикатор , который должен рисовать значение функции в DLL


//+------------------------------------------------------------------+
 
//+------------------------------------------------------------------+
#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Red
#property  indicator_color2  Blue
#property  indicator_width1 2
#property  indicator_style1 0


#import "myDLL2.dll"
void fire(double   inarray[],double    outarray[]);
#import

double     Buffer1[];
double     Buffer2[];

double  inarray[19],outarray[19];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   SetIndexBuffer(0,Buffer1);
   SetIndexBuffer(1,Buffer2);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {

   for(int i=200;i>=0;i--)
     {

      Buffer1[1]=1;

      fire(inarray,outarray);

      Buffer2[i]=outarray[5];

     }


  }
//+------------------------------------------------------------------+


Почему то ничего не рисуется ((

Ihor Herasko
9064
Ihor Herasko 2016.07.07 19:09  

Так ведь в функции fire ничего не происходит. Во-первых, массив outarray передан по значениям, а не по указателю, т. е. что бы там не записывалось в массив outarray, все это остается внутри функции. Во-вторых, даже если бы и был массив передан правильно, внутри функции fire происходит запись только во второй элемент outarray, а на выходе (в MQL4) читается шестой элемент.

И вообще непонятно, зачем нужен массив inarray. 

Apelsin
395
Apelsin 2016.07.07 19:25  

да ,верно   - правильно будет

Buffer2[i]=outarray[1];


по указателю  так ?


void  __stdcall Fire(double *inarray[10], double *outarray[10])


 
Apelsin
395
Apelsin 2016.07.07 19:35  
Массив inarray будет задействован
Apelsin
395
Apelsin 2016.07.08 11:20  

Новая версия попытки :


/* libfire.h */
#ifdef LIBFILE_EXPORT
#define LIBFILE_API __declspec(dllexport)
#else
#define LIBFILE_API __declspec(dllimport)
#endif
 extern "C" {
    LIBFILE_API void __stdcall Fire(  double  *outarray);
}
=======================================================

/* libfire.cpp */
#define LIBFILE_EXPORT
#include "libfire.h"
   void __stdcall Fire(  double  *outarray )
{
  outarray[1] = 3 ;
}

//--------------------------------------------------------------------
#property indicator_separate_window    // Индик. рисуется в основном окне
#property indicator_buffers 1       // Количество буферов
#property indicator_color1 Blue     // Цвет первой линии
 
#import "mydll.dll" // подключаем нашу DLL
    void   Fire( double & outarray[10]); //функция из  нашей  DLL
#import
 
double    outarray[10] ;
double Buf_0[] ;               // Объявление массивов (под буферы индикатора)
//--------------------------------------------------------------------
int init()                          // Специальная функция init()
  {
   SetIndexBuffer(0,Buf_0);           // Назначение массива буферу
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);  // Стиль линии
  }
//--------------------------------------------------------------------
int start()                         
  {
   int i ;                
   
   i=200;            // Индекс первого непосчитанного
   while(i>=0)                      // Цикл по непосчитанным барам
     {
      // Fire(     outarray) ; 
       Buf_0[i]=  outarray[1] ;    
       i--;
     }
  }


Apelsin
395
Apelsin 2016.07.08 11:21  

Apelsin
395
Apelsin 2016.07.08 11:25  

DLL "собираю" на 64 р машине.

Похоже МТ4 не может работать с 64 р версией DLL ?

Есть выход ?

Или вход !

Apelsin
395
Apelsin 2016.07.08 11:28  





Apelsin
395
Apelsin 2016.07.08 11:29  

Странно , в компиляторе по умолчанию стоит 32 р

Apelsin
395
Apelsin 2016.07.08 11:32  


В опциях проекта есть возможность выбрать версию компилятора.

Кстати стоял 64 р .

Может поэтому ничего и не работает .

Apelsin
395
Apelsin 2016.07.08 11:53  

Вот и все .

Сам индикатор :


Лог.



Индикатор :


С++


Опции компилятора :



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