Why 第一个 MessageBox() 作品而第二个没有?
我不知道问题出在哪里 .
MQL5 可以访问 dll
文件吗?
我需要调用 C#
函数来读取 JSON .
MetaEditor中没有出现错误 .
C# .dll 文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace TestMe
{
class Test
{
// [DllExport("Add", CallingConvention = CallingConvention.StdCall)]
public static int Add(int left, int right)
{
return left + right;
}
public static int Sub(int left, int right)
{
return left - right;
}
public static double AddDouble(double left, double right)
{
return left + right;
}
public static float AddFloat(float left, float right)
{
return left + right;
}
}
}
这是一个 MQL5 代码:
#import "TestMe.dll"
int Add( int left, int right );
int Sub( int left, int right );
float AddFloat( float left, float right );
double AddDouble( double left, double right );
#import
#property strict // MQL-syntax-mode-modifier == "strict"
int OnInit()
{ int k = 0;
MessageBox( k ); // this call works
k = Add( 1, 666 );
MessageBox( k ); // Doesn't work
return( INIT_SUCCEEDED );
}
1 回答
Welcome 来了
Wild Worlds of MQL
如何测试DLL函数调用访问?
这是最简单的部分 . 从
DLL
内部进行测试 . 将 stdout 上的一些输入/输出参数/值打印添加到每个DLL
功能源中,并且在调试阶段,您可以在那里覆盖所有需要的C#
侧自诊断功能 .MQL -side还需要允许所有DLL调用,请检查MetaTrader Terminal 5设置:
[x]允许DLL导入....
语法问题:逐项检查calling-signature(s)
MQL 文档说明了要使用 MessageBox() 的单个明确的呼叫签名:
MQL不是C#MQL-string实际上不是一个字符串,但结构MQL不能原谅任何一个细微的细节:应该小心谨慎:
MQL 文件说明:
This is The Strange Answer to why the first call worked.
MessageBox()
没有尝试访问它的调用上的任何内存位置,因为伪造的MQL-string-struct(ill) - 它自己声明,通过.size
struct-component它自己的.buffer
内存区域(间接寻址)有0个字节长度因而 no memory area (根据定义,最终与某些其他内存对象的地址空间冲突) will be, in this specific case accessed.在
MQL
领域工作了十多年之后,凭借超过几百人*年的实践团队经验和语法语法,我可能敢于说,MetaTrader Terminal在很多情况下都让我们无毛,甚至当代码逐字逐句地发布文档时 .随意查看MQL上的其他帖子,了解有关DLL集成噩梦的更多详细信息,以及有关进入分布式处理的好故事, GPGPU -computing等 .
关于JSON的最后评论
如果我要设计一个通过
JSON
进行通信的体系结构,我会使用 ZeroMQ DLL 分布式处理服务,这比使用另一个JSON解析器作为绿地项目更快地实现目标 .