how to write a dll? - page 2

 
xrust:

regarding the means - everyone does it their own way

Is this stuff freely available?
 
It will be when I'm finished
 
xrust:
I will when I'm done.
Okay. Got it.)
 

In fact, I was advised to look here for a start http://msdn.microsoft.com/ru-ru/library/1ez7dh12.aspx

 
dmmikl86:
I'm a programmer for 2 years in MQL4, studied the tutorial from the site. now I want to learn how to write a dll for mt4. i want to learn how to start writing a dll. advise where to get help, what to read, first I would like to write a simple advisor with dll-key connection, which will create a window with two buttons BUY and SELL. i.e. trade in one click. i appreciate any help ...

good topic, well done compatriot

I am very curious to share my experience and knowledge with the mt4 programmers.

 
Geronimo:

good topic, well done compatriot

And I recommend to tough programmers (as well as site administrators) to start tutorial branches on such topics

Man, we all need your advices, we just can't live without them...

 
xrust:

We all need your advice, we just can't live without it...


you could just add a question to the FAQ section with a good answer....
 
dmmikl86:

can we just add a question to the FAQ section with a good answer....
OK, let's do that.
 

I tried to add my function to the .cpp and did it like this:

//+------------------------------------------------------------------+
//|                                              Sample DLL for MQL4 |
//|                 Copyright © 2004-2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
//----
#define MT4_EXPFUNC __declspec(dllexport)
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#pragma pack(push,1)
struct RateInfo
  {
   unsigned int      ctm;
   double            open;
   double            low;
   double            high;
   double            close;
   double            vol;
  };
#pragma pack(pop)
//----
struct MqlStr
  {
   int               len;
   char             *string;
  };
static int CompareMqlStr(const void *left,const void *right);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
  {
//----
   switch(ul_reason_for_call)
     {
      case DLL_PROCESS_ATTACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
         break;
     }
//----
   return(TRUE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC int __stdcall GetIntValue(const int ipar)
  {
   printf("GetIntValue takes %d\n",ipar);
   return(ipar);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC int __stdcall myfunc(int a, int b)
  {
   int c=a+b;
   return(c);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC double __stdcall GetDoubleValue(const double dpar)
  {
   printf("GetDoubleValue takes %.8lf\n",dpar);
   return(dpar);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC char* __stdcall GetStringValue(char *spar)
  {
   printf("GetDoubleValue takes \"%s\"\n",spar);
   return(spar);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC double __stdcall GetArrayItemValue(const double *arr,const int arraysize,const int nitem)
  {
//----
   if(arr==NULL)
     {
      printf("GetArrayItemValue: NULL array\n");
      return(0.0);
     }
   if(arraysize<=0)
     {
      printf("GetArrayItemValue: wrong arraysize (%d)\n", arraysize);
      return(0.0);
     }
   if(nitem<0 || nitem>=arraysize)
     {
      printf("GetArrayItemValue: wrong item number (%d)\n", nitem);
      return(0.0);
     }
//----
   return(arr[nitem]);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC BOOL __stdcall SetArrayItemValue(double *arr,const int arraysize,const int nitem,const double value)
  {
//----
   if(arr==NULL)
     {
      printf("GetArrayItemValue: NULL array\n");
      return(FALSE);
     }
   if(arraysize<=0)
     {
      printf("GetArrayItemValue: wrong arraysize (%d)\n", arraysize);
      return(FALSE);
     }
   if(nitem<0 || nitem>=arraysize)
     {
      printf("GetArrayItemValue: wrong item number (%d)\n", nitem);
      return(FALSE);
     }
//----
   arr[nitem]=value;
   return(TRUE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC double __stdcall GetRatesItemValue(const RateInfo* rates,const int rates_total,const int shift,const int nrate)
  {
//----
   if(rates==NULL)
     {
      printf("GetRatesItemValue: NULL array\n");
      return(0.0);
     }
//----
   if(rates_total<0)
     {
      printf("GetRatesItemValue: wrong rates_total number (%d)\n", rates_total);
      return(0.0);
     }
//----
   if(shift<0 || shift>=rates_total)
     {
      printf("GetRatesItemValue: wrong shift number (%d)\n", shift);
      return(0.0);
     }
//----
   if(nrate<0 || nrate>5)
     {
      printf("GetRatesItemValue: wrong rate index (%d)\n", nrate);
      return(0.0);
     }
//----
   int nitem=rates_total-1-shift;
   switch(nrate)
     {
      case 0: return double(rates[nitem].ctm);
      case 1: return rates[nitem].open;
      case 2: return rates[nitem].low;
      case 3: return rates[nitem].high;
      case 4: return rates[nitem].close;
      case 5: return rates[nitem].vol;
     }
//----
   return(0.0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC int __stdcall SortStringArray(MqlStr *arr,const int arraysize)
  {
//----
   if(arr==NULL)
     {
      printf("SortStringArray: NULL array\n");
      return(-1);
     }
   if(arraysize<=0)
     {
      printf("SortStringArray: wrong arraysize (%d)\n", arraysize);
      return(-1);
     }
//----
   qsort(arr,arraysize,sizeof(MqlStr),CompareMqlStr);
//----
   return(arraysize);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC int __stdcall ProcessStringArray(MqlStr *arr,const int arraysize)
  {
   int   len1,len2;
//----
   if(arr==NULL)
     {
      printf("ProcessStringArray: NULL array\n");
      return(-1);
     }
   if(arraysize<=0)
     {
      printf("ProcessStringArray: wrong arraysize (%d)\n", arraysize);
      return(-1);
     }
//----
   for(int i=0; i<arraysize-1; i++)
     {
      if(arr[i].string==NULL) len1=0;
      else len1=strlen(arr[i].string);
      if(arr[i+1].string==NULL) len2=0;
      else len2=strlen(arr[i+1].string);
      //---- uninitialized string
      if(arr[i+1].string==NULL) continue;
      //---- destination string is uninitialized and cannot be allocated within dll
      if(arr[i].string==NULL)   continue;
      //---- memory piece is less than needed and cannot be reallocated within dll
      if(arr[i].len<len1+len2)  continue;
      //---- final processing
      strcat(arr[i].string,arr[i+1].string);
     }
//----
   return(arraysize);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CompareMqlStr(const void *left,const void *right)
  {
   MqlStr *leftstr=(MqlStr *)left;
   MqlStr *rightstr=(MqlStr *)right;
//----
   if(leftstr->string==NULL) return(-1);
   if(rightstr->string==NULL) return(1);
//----
   return(strcmp(leftstr->string,rightstr->string));
  }
//+------------------------------------------------------------------+

added a function to .def

LIBRARY ExpertSample

EXPORTS GetIntValue
                myfunc
        GetDoubleValue
        GetStringValue
        GetArrayItemValue
        SetArrayItemValue
        GetRatesItemValue
        SortStringArray
        ProcessStringArray

added the function to .mqh

#import "ExpertSample.dll"
int    GetIntValue(int);
int    myfunc(int,int);
double GetDoubleValue(double);
string GetStringValue(string);
double GetArrayItemValue(double arr[],int,int);
bool   SetArrayItemValue(double& arr[],int,int,double);
double GetRatesItemValue(double rates[][6],int,int,int);
int    SortStringArray(string& arr[],int);
int    ProcessStringArray(string& arr[],int);

then added it to the Expert Advisor

int init()
  {
   
   double ret,some_value=10.5;
   string sret;
   int    cnt,c;
   string strarray[6]={ "first", "second", "third", "fourth", "fifth" };
//---- simple dll-functions call
   cnt=GetIntValue(some_value);
   Print("Returned value is ",cnt);
   ret=GetDoubleValue(some_value);
   Print("Returned value is ",ret);
   sret=GetStringValue("some string");
   Print("Returned value is ",sret);
//----
   cnt=SortStringArray(strarray,ArraySize(strarray));
   for(int i=0; i<cnt; i++) Print(i," - ",strarray[i]);
   cnt=ProcessStringArray(strarray,ArraySize(strarray));
   for(i=0; i<cnt; i++) Print(i," - ",strarray[i]);
//----
   int a=5;
   int b=6;
   c=myfunc(a,b);
   Comment("!!!="+c);
   return(0);
  }

During the debug in the visual it said: The program "[5248] regsvr32.exe: Machine code" has stopped with code 0 (0x0).

when I run this advisor on the terminal, it says error : 2011.07.08 12:20:14 ExportFunctions EURUSD,H1: cannot call function 'myfunc' from dll 'ExpertSample.dll'(error 127)

Please advise where are the errors and how to fix them...

 

here's all the text from the debug

"regsvr32.exe": Загружено "C:\WINDOWS\system32\regsvr32.exe"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\ntdll.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\kernel32.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\msvcrt.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\advapi32.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\rpcrt4.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\secur32.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\user32.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\gdi32.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\ole32.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\imm32.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\MSCTF.dll"
"regsvr32.exe": Загружено "C:\Program Files\NVIDIA Corporation\nView\nView.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\comctl32.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\oleaut32.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\psapi.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\shell32.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\shlwapi.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\winmm.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\version.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\ntmarta.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\samlib.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\wldap32.dll"
"regsvr32.exe": Загружено: "C:\Program Files\NVIDIA Corporation\nView\NVWRSRU.dll", Двоичный код не был построен с отладочной информацией.
"regsvr32.exe": Загружено "C:\WINDOWS\system32\MSCTFIME.IME"
"regsvr32.exe": Загружено "C:\Program Files\NVIDIA Corporation\nView\nvwimg.dll"
"regsvr32.exe": Выгружено: "C:\Program Files\NVIDIA Corporation\nView\nvwimg.dll"
"regsvr32.exe": Загружено "C:\WINDOWS\system32\nvwddi.dll"
"regsvr32.exe": Загружено "C:\Program Files\NVIDIA Corporation\nView\nvwimg.dll"
"regsvr32.exe": Выгружено: "C:\Program Files\NVIDIA Corporation\nView\nvwimg.dll"
Программа "[4944] regsvr32.exe: Машинный код" завершилась с кодом 1 (0x1).