MQL5:通过DLL实现跨沙箱传递消息
MetaTrader 5 交易平台的保护系统不允许 MQL5 程序在外部运行它们的沙箱。所以在实现MetaTrader 5 平台向其沙箱外传递信息,考虑使用DLL实现。
关于如何写一个MT5可以使用的dll具体步骤在我写的这篇博文里–>vs2015:MFC创建可供其他语言使用的dll,里面有对语句的详细介绍,本文不再赘述。
在实现MT5向外传递文本信息时,考虑使用C++自带的文件复制函数CopyFile,然后考虑写一个函数,其参数列表为两个字符串型地址,然后调用CopyFile实现文件传递。
一开始,想都没想参数类型肯定是string,然后这么写了
extern "C" void PASCAL EXPORT copyf(string str, string tr)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CopyFile(str,tr,false);
}
结果报错了,说string类型不是CopyFile的参数类型。
然后在浏览CopyFile的参数类型定义后,第一次知道这个类型 WCHAR*
GDI+所有类的接口函数如果要传递字符串作为参数的话,似乎都用UNICODE串,即WCHAR*。
(感兴趣的可以自己取去了解这个类型,我就不说了,因为我也不怎么了解。)
于是,我改成这么写
extern "C" void PASCAL EXPORT copyf(WCHAR* str, WCHAR* tr)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CopyFile(str,tr,false);
}
所以编译得到的dll文件放在MT5的库目录下。
然后注意了,MT5里是没有WCHAR*类型的,
那引入函数怎么写呢?
MT5的引入动态库的定义是这样的,引用dll中的某个函数必须带该函数完整的定义和参数列表,例子如下:
#import "kernel32.dll" //动态库名
int GetLastError(); //函数名
#import
所以按语法我应该写成
#import "mfctest2.dll"
void copyf(WCHAR* str,sWCHAR* tr);
#import
但是不可以这么写,因为WCHAR*在MT5里是未被定义的标识符,应该写成
#import "mfctest2.dll"
void copyf(string str,string tr);
#import
这样就对了,就可以正常使用这个copyf函数来将MT5中需要的消息写到MT5沙箱外了。
就是这个WCHAR类型和它在MT5中可用string*表示困扰我好久,终于解决MT5通过DLL实现向沙箱外传递信息的问题了。