繁体   English   中英

如何创建C ++ DLL(使用DEV -C ++)并在MT4脚本中使用(逐步)

[英]How to create C++ DLL (with DEV -C++) and use in MT4 script (Step by step)

我试图使用DEV-C ++ IDE工具创建自己的DLL,并尝试在MT4脚本中使用它。 我尝试研究任何MT4安装中可用的示例文件[MT4_HOME] \\ MQL4 \\ Scripts \\ Examples \\ DLL \\ DLLSample.cpp,并且尝试对其他脚本遵循相同的逻辑,但没有成功。 在下面,我将非常详细地描述我所遵循的步骤,以使其更加清楚。 我想了解为什么执行上述步骤后我自己的dll无法正常工作。


系统配置

  1. Windows 10笔记本电脑;
  2. 安装了cpp
  3. 已安装MT4

目标

  1. 使用“ dev–c ++” IDE工具编写自己的dll;
  2. 编译dll;
  3. 使用dll进入mt4中的简单脚本。

脚步

  1. 首先,我在桌面上创建一个名为mydll的文件夹。
  2. 我启动dev-cpp IDE工具;
  3. 文件->新建->项目;
  4. 我选择项目类型-> DLL
  5. 我写项目名称:mydll
  6. 我按确定按钮
  7. 然后,选择要在其中保存项目的文件夹(在步骤a中在桌面中创建的mydll文件夹),然后按保存
  8. 此时,Dev –C ++向我展示了两个文件模板(dllmain.cpp,dll.h),但我忽略了它们并关闭了它们,而没有将它们保存到项目中。 关闭它们后,我还将它们从IDE工具中删除(用鼠标写单击,然后单击每个文件的删除文件)
  9. 现在,我对devc ++项目-> New File进行了更改
  10. 现在,我将自己的DLL的源代码粘贴到此文件中。 (下面的代码)注意:对于熟悉metatrader 4的人,请注意,此代码是标准MT4安装文件[MT4_HOME] \\ MQL4 \\ Scripts \\ Examples \\ DLL \\ DLLSample.cpp的片段

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
//---
#define MT4_EXPFUNC __declspec(dllexport)


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

  1. 我将此文件保存到名为mydll.cpp的DEV-C ++项目文件夹中
  2. 现在,在DEV-C ++ ide工具中,我按F9按钮来编译该文件。
  3. 观察结果: 编译过程成功完成,没有任何错误和警告b。 一些文件会出现在DEV-C ++项目中(mydll.dll,libmydll.def,libmydll.a,mydll.o,Makefile.win,mydll.layout)。
  4. 现在,我将mydll.dll复制并粘贴到MT4的[MT4_HOME] \\ MQL4 \\ Libraries目录中
  5. 现在,我创建一个空文件夹[MT4_HOME] \\ MQL4 \\ Scripts \\ Examples \\ mydll
  6. 我将文件mydll.cpp和libmydll.def复制并粘贴到[MT4_HOME] \\ MQL4 \\ Scripts \\ Examples \\ mydll文件夹中
  7. 最后,我在[MT4_HOME] \\ MQL4 \\ Scripts \\ Examples \\ mydll文件夹中创建一个名为mydllTester.mq4的新文件。 下面是源代码

#import "DLLTutorial.dll"
int    _Z11GetIntValuei(int);  
#import

void OnStart()
{
   int cnt=_Z11GetIntValuei(int(10)); 
   Comment(cnt);
}

  1. 我使用MT4代码编辑器打开文件mydllTester.mq4,然后编译该文件。
  2. 最终测试作为最后一步,我进行测试以检查是否可行。 打开Metatrader4,打开新图表,然后单击脚本。 我的期望是数字10出现在图表的左上角,但是不起作用。 您可以帮助我了解我在犯错误的步骤吗? 非常感谢。致以最诚挚的问候

最后,我找到了解决问题的方法,现在,我可以编写一个简单的DLL,并成功从MT4调用它。 步骤如下:

  1. 创建文件mydll.cpp
  2. 写入文件mydll.cpp的内容

#include <stdlib.h> 

#ifdef __cplusplus 
extern "C" 
{ 
#endif 
__declspec(dllexport) int __stdcall DLLAdd(int i, int j) ; 
#ifdef __cplusplus 
} 
#endif 

__declspec(dllexport) int __stdcall DLLAdd(int i, int j) 
{ 
    return i+j; 
} 

  1. 编译文件mydll.cpp(请注意使用“ TDM-GCC 32位发行版”编译器进行编译,因为MT4是32位应用程序,并且它仅理解32位已编译文件)。 编译器将生成文件mydll.dll,libmydll.def

  2. 将文件mydll.dll复制到MT4的[MT4_HOME] \\ MQL4 \\ Libraries目录中

  3. 在MT4的[MT4_HOME] \\ MQL4目录中(或您要在MT4主文件夹中的任何位置)创建一个文件夹“ test_script”

  4. 将libmydll.def文件复制并粘贴到“ test_script”文件夹中

  5. 在“ test_script”文件夹中创建一个新脚本“ mydlltester.mq4”

  6. 写入“ mydlltester.mq4”文件的内容如下


#property strict

#import "mydll.dll"
    int DLLAdd(int i, int j); 
#import

void OnStart()
{ 
   Comment(DLLAdd(2,3));
}

  1. 使用MT4编译器打开“ mydlltester.mq4”文件并进行编译
  2. 最终测试:如果现在在mt4中打开一个图表并运行脚本mydlltester,您将看到总和5出现在图表的左上角。 干杯!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM