如何写一个dll? - 页 2

 
xrust:

关于手段 - 每个人都有自己的方式

这些东西可以免费获得吗?
 
等我完成后就可以了
 
xrust:
我完成后会的。
好的。明白了)。
 

事实上,有人建议我在这里寻找一个起点http://msdn.microsoft.com/ru-ru/library/1ez7dh12.aspx

 
dmmikl86:
我是一个在MQL4中工作了2年的程序员,学习了网站上的教程。现在我想学习如何为MT4编写一个DLL,我想学习如何开始编写一个DLL。

好题目,做得好的同胞

我很想与mt4程序员分享我的经验和知识。

 
Geronimo:

好题目,做得好的同胞

我建议强硬的程序员(以及网站管理员)开始关于此类主题的教程分支

伙计,我们都需要你的建议,我们就是不能没有他们。

 
xrust:

我们都需要你的建议,我们就是离不开它......。


你可以在常见问题部分添加一个问题,并提供一个好的答案....。
 
dmmikl86:

我们能不能在常见问题部分增加一个问题,并给出一个好的答案....
好的,让我们加入
 

我试着在.cpp中加入我的函数,是这样做的。

//+------------------------------------------------------------------+
//|                                              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));
  }
//+------------------------------------------------------------------+

在.def中添加了一个函数

LIBRARY ExpertSample

EXPORTS GetIntValue
                myfunc
        GetDoubleValue
        GetStringValue
        GetArrayItemValue
        SetArrayItemValue
        GetRatesItemValue
        SortStringArray
        ProcessStringArray

在.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);

然后将其添加到专家顾问中

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);
  }

在可视化调试过程中,它说:程序"[5248] regsvr32.exe:机器代码 "以代码0(0x0)停止。

当我在终端上运行这个顾问时,它说错误:2011.07.08 12:20:14 ExportFunctions EURUSD,H1: 不能从dll 'ExpertSample.dll' 调用函数'myfunc'(错误 127)

请告诉我们哪里有错误,如何解决这些问题...

 

这是调试时的所有文本

"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).