Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从[MQL5]代码中的DLL文件调用函数?_C#_Algorithmic Trading_Mql4_Mql5_Metatrader5 - Fatal编程技术网

C# 如何从[MQL5]代码中的DLL文件调用函数?

C# 如何从[MQL5]代码中的DLL文件调用函数?,c#,algorithmic-trading,mql4,mql5,metatrader5,C#,Algorithmic Trading,Mql4,Mql5,Metatrader5,为什么第一个MessageBox()有效,而第二个无效 我不知道问题出在哪里 MQL5是否可以访问dll文件 我需要调用读取JSON的函数 MetaEditor中不会出现任何错误 C#.dll文件: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServic

为什么第一个
MessageBox()
有效,而第二个无效

我不知道问题出在哪里

MQL5
是否可以访问
dll
文件

我需要调用读取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 );
    }

欢迎来到
野生
世界
MQL

如何测试DLL函数调用访问? 这是最简单的部分。从
DLL
内部测试它。在每个
DLL
-函数源中添加一些打印在
标准输出上的输入/输出参数/值,在调试阶段,您将获得所有需要的
C#
端自诊断

MQL
端还需要允许所有DLL调用,请检查MetaTrader终端5设置:
[x]允许DLL导入…


语法事项:逐项检查调用签名
MQL
文档说明了要使用的
MessageBox()
的单个清晰调用签名:

int
消息框(

字符串
文本
,//消息文本

string
caption=NULL
,//框头

int
标志=0
);//定义框中的一组按钮


参数:

文本
:[in]
文本,包含要输出的消息。

标题
=NULL:[in]
要显示在框标题中的可选文本。如果参数为空,则在框标题中显示专家顾问名称。

标志
=0:[in]
定义消息框外观和行为的可选标志。标志可以是一组特殊标志的组合。(加:默认值值==0=
MB_OK


返回值:

如果函数成功执行,则返回值是
MessageBox()
返回代码的值之一。(它们是:
{IDOK | IDCANCEL | idbort | idrray | IDIGNORE | idies | IDNO | IDTRYAGAIN | IDCONTINUE}


MQL
不是C#
MQL
-事实上,字符串不是
字符串,但
结构体

MQL
不会原谅任何微小的细节:
必须谨慎:
MQL
文档说明:

字符串类型的内部表示为12字节长的结构:

这是
第一个调用为什么起作用的奇怪答案。
消息框()
没有尝试访问其调用中的任何内存位置,正如伪造的MQL字符串结构(ill)-通过它自己的
.size
结构组件
.buffer
内存区域(间接寻址)声明的那样长度为0字节,因此没有内存区域(根据定义,最终与某个其他内存对象的地址空间冲突)将在这种特定情况下被访问。

MQL
领域工作了十多年之后,凭借数百人*年的团队实践经验,我敢说,“不要依赖于编译阶段没有报告错误”,MetaTrader终端在许多情况下让我们变得不那么毛骨悚然,即使代码逐字跟随已发布的文档

请随意查看MQL上的其他帖子,以了解有关DLL集成噩梦的更多详细信息,以及进入分布式处理的好故事,
GPGPU
-computing等


关于
JSON
如果我要设计一个通过
JSON
进行通信的体系结构,我会使用
zeromqdll
分布式处理服务,这将使您的目标实现得更快,而不仅仅是将另一个JSON解析器构建为一个绿地项目

#pragma pack(push,1) 
struct MqlString 
  { 
   int      size;       // 32-bit integer, contains size of the buffer, allocated for the string. 
   LPWSTR   buffer;     // 32-bit address of the buffer, containing the string. 
   int      reserved;   // 32-bit integer, reserved. 
  }; 
#pragma pack(pop,1)