如何写一个dll? - 页 2 1234567 新评论 Лекарь Центозависимых 2011.07.07 18:16 #11 xrust: 关于手段 - 每个人都有自己的方式 这些东西可以免费获得吗? Rustamzhan Salidzhanov 2011.07.07 18:28 #12 等我完成后就可以了 Лекарь Центозависимых 2011.07.07 18:39 #13 xrust: 我完成后会的。 好的。明白了)。 Михаил 2011.07.07 20:27 #14 事实上,有人建议我在这里寻找一个起点http://msdn.microsoft.com/ru-ru/library/1ez7dh12.aspx。 Леонид 2011.07.07 21:12 #15 dmmikl86: 我是一个在MQL4中工作了2年的程序员,学习了网站上的教程。现在我想学习如何为MT4编写一个DLL,我想学习如何开始编写一个DLL。好题目,做得好的同胞 我很想与mt4程序员分享我的经验和知识。 Rustamzhan Salidzhanov 2011.07.07 21:35 #16 Geronimo: 好题目,做得好的同胞 我建议强硬的程序员(以及网站管理员)开始关于此类主题的教程分支 伙计,我们都需要你的建议,我们就是不能没有他们。 Михаил 2011.07.07 22:40 #17 xrust: 我们都需要你的建议,我们就是离不开它......。 你可以在常见问题部分添加一个问题,并提供一个好的答案....。 Rustamzhan Salidzhanov 2011.07.07 22:53 #18 dmmikl86: 我们能不能在常见问题部分增加一个问题,并给出一个好的答案.... 好的,让我们加入 Михаил 2011.07.08 11:34 #19 我试着在.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) 请告诉我们哪里有错误,如何解决这些问题... Михаил 2011.07.08 11:42 #20 这是调试时的所有文本 "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). 1234567 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
关于手段 - 每个人都有自己的方式
我完成后会的。
事实上,有人建议我在这里寻找一个起点http://msdn.microsoft.com/ru-ru/library/1ez7dh12.aspx。
我是一个在MQL4中工作了2年的程序员,学习了网站上的教程。现在我想学习如何为MT4编写一个DLL,我想学习如何开始编写一个DLL。
好题目,做得好的同胞
我很想与mt4程序员分享我的经验和知识。
好题目,做得好的同胞
我建议强硬的程序员(以及网站管理员)开始关于此类主题的教程分支
伙计,我们都需要你的建议,我们就是不能没有他们。
我们都需要你的建议,我们就是离不开它......。
你可以在常见问题部分添加一个问题,并提供一个好的答案....。
我们能不能在常见问题部分增加一个问题,并给出一个好的答案....
我试着在.cpp中加入我的函数,是这样做的。
在.def中添加了一个函数
在.mqh中添加了该功能
然后将其添加到专家顾问中
在可视化调试过程中,它说:程序"[5248] regsvr32.exe:机器代码 "以代码0(0x0)停止。
当我在终端上运行这个顾问时,它说错误:2011.07.08 12:20:14 ExportFunctions EURUSD,H1: 不能从dll 'ExpertSample.dll' 调用函数'myfunc'(错误 127)
请告诉我们哪里有错误,如何解决这些问题...
这是调试时的所有文本