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

时间:2016-04-26 09:56:58

标签: c# algorithmic-trading mql4 mql5 metatrader5

为什么第一个 MessageBox() 有效,第二个没有?

我不知道问题出在哪里。

MQL5 是否可以访问dll文件?

我需要调用{strong> 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 个答案:

答案 0 :(得分:0)

欢迎加入狂野世界MQL

如何测试DLL函数调用访问?

这是最简单的部分。从DLL内部进行测试。将 stdout 上的一些输入/输出参数/值打印添加到每个DLL - 函数源中,在调试阶段,您可以获得所有需要的C# - 侧那里有自我诊断。

MQL -side还需要允许所有DLL调用,请检查 MetaTrader Terminal 5 设置:
{{ 1}}

语法问题:逐项检查呼叫签名

[x] Allow DLL imports ... 文档说明了要使用 MQL 的单个明确的呼叫签名:

  

MessageBox() int
  MessageBox( string text
  , // message text string caption = NULL
  , // box header int flags = 0

  的 ); // defines set of buttons in the box
   Parameters : text文字,包含要输出的信息。

   : [in] caption要在框标题中显示的可选文字。如果参数为空,则EA标题将显示在框标题中。

   = NULL : [in] flags可选标志,用于定义消息框的外观和行为。标志可以是一组特殊标志的组合。 Plus:默认值== 0 == = 0 : [in]

   MB_OK
如果功能成功执行,则返回的值为Return Value :返回码的值之一。 MessageBox()

{ IDOK | IDCANCEL | IDABORT | IDRETRY | IDIGNORE | IDYES | IDNO | IDTRYAGAIN | IDCONTINUE }不是C#MQL - 字符串实际上不是 MQL ,而是 string
struct并不原谅任何一个细节:必须小心

MQL 文档声明:

  

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

MQL

#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) 这是第一次调用的原因。
The Strange Answer没有尝试访问其调用的任何内存位置,因为伪造的MQL -string-struct(ill) - 自己声明,通过MessageBox() struct-component它自己的.size内存区域(间接寻址),其长度为0个字节,因此没有内存区域< / strong>(根据定义,最终与某些其他内存对象的地址空间冲突)将在此特定情况下访问。

.buffer领域工作了十多年之后,凭借悄悄MQL语言语法,拥有超过几百人*多年的实践团队经验,我敢说,“不依赖于编译阶段没有报告错误“ MetaTrader终端在许多情况下使我们无毛,即使代码是逐字逐句发布的文档

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

GPGPU

的最后评论

如果我要设计一个通过JSON进行通信的架构,我会使用 JSON 分布式处理服务,这会使您的目标比构建更快只是另一个JSON解析器作为绿地项目。