李邦良 金华:MqlImportDll

来源:百度文库 编辑:中财网 时间:2024/04/26 11:15:06
MqlImportDll   Mql中调用DLL 的简单例子. Updated Jul 7, 2011 by tingle2008@gmail.com

Introduction

在MT4中,使用DLLs(动态链接库)来做什么?

MQL4能让你做事情是极为有限的,有很多事情在MQL4上做不了。为了得到Windows操作系统的全部控制(比如,进入windows注册表或文件,处理相关的APIs)您得需要:

  • 引用Windows的公用DLLs,导入你所需要的函数功能,这就是一个范例:
#import "user32.dll" 
int MessageBoxA(int hWnd, string lpText, string lpCaption, int uType);

上述语句中我们使用关键字#import来导入user32.dll之函数:MessageBoxA函数

这样我们就能在我们自己的代码上使用该函数。

  • 第二个选择,就是通过C++创建自己的动态连接库DLLs,它和Windows的公用DLLs一样,可在我们的代码中调用。

DLL编译工具

最佳选择是Visaul C++,我使用Microsoft Visual c++ 6。现在,让我们创建第一个DLL,它将带给我们一句简单的问候语"Hello World!"。

Hello, World! 动态链接库的编译 

  • 第一步,打开Visual C++
  • “文件”菜单里选择“新建”,出现一个对话窗:
  • 在对话窗中选择"MFC AppWizard (dll)",输入工程名称:"demo",点击OK;
注解:你可以选择"Win32 Dynamic-Link Library"代替"MFC AppWizard (dll)" 但这样的话你就不能使用"CString"类型,而"CString"类型是应用起来较为简单的MFC类型。
  • 出现另一个对话窗,无需更改其默认的选择,按"完成"确认。然后,会弹出一个信息窗口,按"OK"。
  • 恭喜!你已创建一个名为"demo"的工程文件,你可以开始写你自己的DLL代码了。请打开"demo.cpp"文件看看…

首先我们拟写一行代码:.

#define MT4_EXPFUNC __declspec(dllexport) 
 
你必须把此行代码放在这些代码的后面: 
 
#include "stdafx.h" 
#include "demo.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif

再增加一些代码,在"demo.cpp"的这行代码后面(也就是文件的末端):

CDemoApp theApp;

我们写入这样的代码,来描述"Hello"函数:

MT4_EXPFUNC void __stdcall Hello(char* say) 
{ 
MessageBox(NULL,say,"demo",NULL); 
}
  • 我们有了"Hello"函数:其功能是把一个字符串说出来,而且不返回任何值(void)。在C++中,我们需要在一个DEF文件里声明该函数,才能给供外部调用。

我们打开"demo.def"文件,在文件尾部添加一行代码(粗体):

; demo.def : Declares the module parameters for the DLL. 
 
LIBRARY "demo" 
DESCRIPTION 'demo Windows Dynamic Link Library' 
 
EXPORTS 
; Explicit exports can go here 
Hello
  • 按F7编译该DLL,如果您和我一样幸运的话,编译中将不会提示任何错误或警告。在Debug文件夹里,可以找到demo.dll文件。

通过 Mingw 来开发编译 windows 下的 DLL

  • 首先安装 Mingw 的编译环境,如果使用 debian 那么可以简单的
    • sudo apt-get install mingw32 mingw32-binutils mingw32-runtime

测试我们的demo.dll

  • 把编译好的demo.dll文件放到文件夹MetaTrader 4\experts\libraries
  • 打开MetaEditor创建一个名为demo.mqh的include文件,用来声明"Hello"函数。

代码如下:

#import "demo.dll" 
void Hello(string); 
#import
留意我们是如何已经引入了DLL文件,以及我们如何声明"Hello"函数的:必须使用同样的参数类 型( string: MT4的字符串类型,对应于C++的char* str)及返回值(void),与DLL中定义的函数 相符。文件将存档于Include文件夹(MetaTrader 4\experts\include).
  • 现在,我们创建一个script来测试demo.dll。
我们命名它为"Hello.mq4" ,必须存档于Scripts文件夹 (MetaTrader 4\experts\scripts).
#include <demo.mqh> 
int start() 
{ 
Hello ("Hello World!"); 
return(0); 
}
留意在代码开始部分,我们如何“包含”demo.mqh文件,使它成为我们代码的一部分。
  • 编译该script (F5),装载它(鼠标双击终端的导航窗口)。你得到什么?一个漂亮的对话窗。
注意:在使用涉及引用外部函数(不管是普通的windows dlls 还是你自己的dlls)的任何代码前, 你必须在MetaTrader中打开“Allow DLL imports”功能。 通过 工具 -> 选项 -> 智能交易系统,打开"允许导入动态链接库"功能。

补充说明:

能否把.mqh文件省掉?答案当然是可以的,只需把其内容镶嵌到.mq4文件的开头:
#import "demo.dll" 
void Hello(string); 
#import 
int start() 
{ 
Hello("Hello World!"); 
return(0); 
}