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

时间:2017-08-15 16:21:36

标签: c++ dll mt4

我正在尝试使用DEV-C ++ IDE工具创建自己的DLL并尝试在MT4脚本中使用它。 我试图研究任何MT4安装中可用的示例文件[MT4_HOME] \ MQL4 \ Scripts \ Examples \ DLL \ DLLSample.cpp,我尝试使用与其他脚本相同的逻辑但没有成功。下面我将详细介绍我要遵循的步骤,以便明确。 我想了解为什么按照所描述的步骤我自己的dll不起作用。

系统配置

  1. 带有Windows 10的笔记本电脑;
  2. 安装了Dev-cpp
  3. MT4已安装
  4. 目标

    1. 使用“dev-c ++”IDE工具编写自己的dll;
    2. 编译dll;
    3. 将dll用于mt4中的简单脚本。
    4. 步骤

      1. 首先,我在桌面上创建一个名为mydll;
      2. 的文件夹
      3. 我启动了dev-cpp IDE工具;
      4. 文件 - >新 - >项目;
      5. 我选择项目类型 - > DLL
      6. 我写项目名称:mydll
      7. 我按OK按钮
      8. 然后我选择保存项目的文件夹(步骤a中在桌面上创建的文件夹mydll)并按保存
      9. 此时Dev -C ++向我展示了两个文件模板(dllmain.cpp,dll.h),但我忽略它们并关闭它们而不将它们保存到项目中。关闭它们之后,我也将它们从IDE工具中删除(用鼠标单击并单击每个文件的删除文件)
      10. 现在我修改了devc ++项目 - >新文件
      11. 现在我将自己的DLL的源代码粘贴到此文件中。 (以下代码) 注意:对于熟悉metatrader 4的人,请注意此代码是标准MT4安装文件[MT4_HOME] \ MQL4 \ Scripts \ Examples \ DLL \ DLLSample.cpp的片段
      12. #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
        2. 的DEV-C ++项目文件夹中
        3. 现在,在DEV-C ++ ide工具中,按F9按钮编译该文件。
        4. 观察: 一个。编译过程成功完成,没有任何错误和任何警告 湾一些文件出现在DEV-C ++项目中(mydll.dll,libmydll.def,libmydll.a,mydll.o,Makefile.win,mydll.layout)。
        5. 现在,我将mydll.dll复制并粘贴到MT4的[MT4_HOME] \ MQL4 \ Libraries目录中
        6. 现在,我创建一个空文件夹[MT4_HOME] \ MQL4 \ Scripts \ Examples \ mydll
        7. 我将文件mydll.cpp和libmydll.def复制并粘贴到[MT4_HOME] \ MQL4 \ Scripts \ Examples \ mydll文件夹中
        8. 最后,我在[MT4_HOME] \ MQL4 \ Scripts \ Examples \ mydll文件夹中创建了一个名为mydllTester.mq4的新文件。以下是源代码
        9. #import "DLLTutorial.dll"
          int    _Z11GetIntValuei(int);  
          #import
          
          void OnStart()
          {
             int cnt=_Z11GetIntValuei(int(10)); 
             Comment(cnt);
          }
          
          1. 我使用MT4代码编辑器打开文件mydllTester.mq4并编译该文件。
          2. 最终测试作为最后一步,我进行测试以检查是否有效。我打开Metatrader4,打开一个新图表,然后点击我的脚本。我的期望是数字10出现在图表的左上角,但不起作用。你能帮助我理解我犯错误的步骤是什么吗? 非常感谢,最好的问候

1 个答案:

答案 0 :(得分:0)

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

  1. 创建文件mydll.cpp
  2. 写入文件mydll.cpp的内容
  3. #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(注意编译使用&#34; TDM-GCC 32位发布&#34;编译器,因为MT4是32位应用程序,它只能理解32位编译文件)。编译器将生成文件mydll.dll,libmydll.def

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

    3. 创建一个文件夹&#34; test_script&#34;进入MT4的[MT4_HOME] \ MQL4目录(或MT4主文件夹中的任何位置)

    4. 复制并粘贴&#34; test_script&#34;文件夹libmydll.def文件

    5. 创建一个新脚本&#34; mydlltester.mq4&#34;在&#34; test_script&#34;内文件夹

    6. 写下&#34; mydlltester.mq4&#34;的内容文件如下

    7. #property strict
      
      #import "mydll.dll"
          int DLLAdd(int i, int j); 
      #import
      
      void OnStart()
      { 
         Comment(DLLAdd(2,3));
      }
      
      1. 打开&#34; mydlltester.mq4&#34;使用MT4编译器编译并编译它
      2. 最终测试:如果您现在在mt4中打开图表并运行脚本mydlltester,您将看到总和5出现在图表的左上角。干杯!!