如何创建 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,并尝试在 ide MT4 脚本中使用它。
我尝试研究任何 MT4 安装中可用的示例文件 [MT4_HOME]\MQL4\Scripts\Examples\DLL\DLLSample.cpp,我尝试对其他脚本遵循相同的逻辑但没有成功。为了清楚起见,我在下面详细描述了我遵循的步骤。
我想了解为什么按照描述的步骤我自己的 dll 不起作用。
系统配置
- 笔记本电脑 windows 10 ;
- 已安装 Dev-cpp
- 已安装 MT4
目标
- 使用"dev–c++"IDE工具编写自己的dll;
- 编译dll;
- 在 mt4 中将 dll 用于一个简单的脚本。
步骤
- 首先,我在桌面上创建了一个名为 mydll 的文件夹;
- 我启动 dev-cpp IDE 工具;
- 文件 -> 新建 -> 项目;
- I select 项目类型 -> DLL
- 我写项目名:mydll
- 我按下确定按钮
- 然后我选择保存项目的文件夹(步骤a在桌面创建的文件夹mydll)并按保存
- 此时 Dev –C++ 向我展示了两个文件模板(dllmain.cpp、dll.h),但我忽略了它们并关闭了它们,而没有将它们保存到项目中。关闭它们后,我还将它们从 IDE 工具中删除(用鼠标单击并为每个单击删除文件)
- 现在我右击 devc++ 项目 -> 新建文件
- 现在我将我自己的 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);
}
- 我将此文件保存到我的 DEV-C++ 项目文件夹中,名称为 mydll.cpp
- 现在,在 DEV-C++ ide 工具中,我按 F9 按钮编译这个文件。
- 观察:
一种。编译过程成功完成,没有任何错误和任何警告
b.一些文件出现在 DEV-C++ 项目中(mydll.dll、libmydll.def、libmydll.a、mydll.o、Makefile.win、mydll.layout)。
- 现在,我将mydll.dll复制并粘贴到MT4
的[MT4_HOME]\MQL4\Libraries目录中
- 现在,我创建一个空文件夹 [MT4_HOME]\MQL4\Scripts\Examples\mydll
- 我将文件 mydll.cpp 和 libmydll.def 复制并粘贴到 [MT4_HOME]\MQL4\Scripts\Examples\mydll 文件夹
- 最后,我在 [MT4_HOME]\MQL4\Scripts\Examples\mydll 文件夹中创建了一个名为 mydllTester.mq4 的新文件。下面是源代码
#import "DLLTutorial.dll"
int _Z11GetIntValuei(int);
#import
void OnStart()
{
int cnt=_Z11GetIntValuei(int(10));
Comment(cnt);
}
- 我用 MT4 代码编辑器打开文件 mydllTester.mq4 并编译文件。
- 最终测试作为最后一步,我进行测试以检查这是否有效。我打开 Metatrader4,打开一个新图表,然后简单地单击我的脚本。我的期望是数字 10 出现在图表的左上角,但它不起作用。你能帮我理解我犯错的步骤吗?
非常感谢,最诚挚的问候
我终于找到了问题的解决方案,现在我可以编写一个简单的 DLL 并从 MT4 成功调用它。
下面的步骤:
- 创建文件mydll.cpp
- 写入文件内容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;
}
编译文件mydll.cpp(注意使用"TDM-GCC 32 bit-release"编译器编译,因为MT4是32位应用程序,只能理解32位编译文件)。编译器将生成文件 mydll.dll , libmydll.def
将文件mydll.dll复制到MT4[MT4_HOME]\MQL4\Libraries目录下
在 MT4 的 [MT4_HOME]\MQL4 目录(或 MT4 主文件夹内的任何位置)创建一个文件夹 "test_script"
在 "test_script" 文件夹中复制并粘贴 libmydll.def 文件
在 "test_script" 文件夹中创建一个新脚本 "mydlltester.mq4"
将"mydlltester.mq4"文件的内容写入如下
#property strict
#import "mydll.dll"
int DLLAdd(int i, int j);
#import
void OnStart()
{
Comment(DLLAdd(2,3));
}
- 用MT4编译器打开"mydlltester.mq4"文件并编译
- 最终测试:如果您现在在 mt4 和 运行 脚本 mydlltester 中打开图表,您将看到总和 5 出现在图表的左上角。干杯!!
我正在尝试使用 DEV-C++ IDE 工具创建我自己的 DLL,并尝试在 ide MT4 脚本中使用它。 我尝试研究任何 MT4 安装中可用的示例文件 [MT4_HOME]\MQL4\Scripts\Examples\DLL\DLLSample.cpp,我尝试对其他脚本遵循相同的逻辑但没有成功。为了清楚起见,我在下面详细描述了我遵循的步骤。 我想了解为什么按照描述的步骤我自己的 dll 不起作用。
系统配置
- 笔记本电脑 windows 10 ;
- 已安装 Dev-cpp
- 已安装 MT4
目标
- 使用"dev–c++"IDE工具编写自己的dll;
- 编译dll;
- 在 mt4 中将 dll 用于一个简单的脚本。
步骤
- 首先,我在桌面上创建了一个名为 mydll 的文件夹;
- 我启动 dev-cpp IDE 工具;
- 文件 -> 新建 -> 项目;
- I select 项目类型 -> DLL
- 我写项目名:mydll
- 我按下确定按钮
- 然后我选择保存项目的文件夹(步骤a在桌面创建的文件夹mydll)并按保存
- 此时 Dev –C++ 向我展示了两个文件模板(dllmain.cpp、dll.h),但我忽略了它们并关闭了它们,而没有将它们保存到项目中。关闭它们后,我还将它们从 IDE 工具中删除(用鼠标单击并为每个单击删除文件)
- 现在我右击 devc++ 项目 -> 新建文件
- 现在我将我自己的 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);
}
- 我将此文件保存到我的 DEV-C++ 项目文件夹中,名称为 mydll.cpp
- 现在,在 DEV-C++ ide 工具中,我按 F9 按钮编译这个文件。
- 观察: 一种。编译过程成功完成,没有任何错误和任何警告 b.一些文件出现在 DEV-C++ 项目中(mydll.dll、libmydll.def、libmydll.a、mydll.o、Makefile.win、mydll.layout)。
- 现在,我将mydll.dll复制并粘贴到MT4 的[MT4_HOME]\MQL4\Libraries目录中
- 现在,我创建一个空文件夹 [MT4_HOME]\MQL4\Scripts\Examples\mydll
- 我将文件 mydll.cpp 和 libmydll.def 复制并粘贴到 [MT4_HOME]\MQL4\Scripts\Examples\mydll 文件夹
- 最后,我在 [MT4_HOME]\MQL4\Scripts\Examples\mydll 文件夹中创建了一个名为 mydllTester.mq4 的新文件。下面是源代码
#import "DLLTutorial.dll"
int _Z11GetIntValuei(int);
#import
void OnStart()
{
int cnt=_Z11GetIntValuei(int(10));
Comment(cnt);
}
- 我用 MT4 代码编辑器打开文件 mydllTester.mq4 并编译文件。
- 最终测试作为最后一步,我进行测试以检查这是否有效。我打开 Metatrader4,打开一个新图表,然后简单地单击我的脚本。我的期望是数字 10 出现在图表的左上角,但它不起作用。你能帮我理解我犯错的步骤吗? 非常感谢,最诚挚的问候
我终于找到了问题的解决方案,现在我可以编写一个简单的 DLL 并从 MT4 成功调用它。 下面的步骤:
- 创建文件mydll.cpp
- 写入文件内容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;
}
编译文件mydll.cpp(注意使用"TDM-GCC 32 bit-release"编译器编译,因为MT4是32位应用程序,只能理解32位编译文件)。编译器将生成文件 mydll.dll , libmydll.def
将文件mydll.dll复制到MT4[MT4_HOME]\MQL4\Libraries目录下
在 MT4 的 [MT4_HOME]\MQL4 目录(或 MT4 主文件夹内的任何位置)创建一个文件夹 "test_script"
在 "test_script" 文件夹中复制并粘贴 libmydll.def 文件
在 "test_script" 文件夹中创建一个新脚本 "mydlltester.mq4"
将"mydlltester.mq4"文件的内容写入如下
#property strict
#import "mydll.dll"
int DLLAdd(int i, int j);
#import
void OnStart()
{
Comment(DLLAdd(2,3));
}
- 用MT4编译器打开"mydlltester.mq4"文件并编译
- 最终测试:如果您现在在 mt4 和 运行 脚本 mydlltester 中打开图表,您将看到总和 5 出现在图表的左上角。干杯!!