MQL5:通过DLL实现跨沙箱传递消息

本文介绍使用MQL5在MetaTrader5平台与其沙箱外进行消息传递的方法。通过C++的DLL和CopyFile函数,实现MT5向外部环境发送文本信息。详细解释了WCHAR*类型在MT5中的应用及函数引入过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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实现向沙箱外传递信息的问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值