首页 文章

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

提问于
浏览
1

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 回答

  • 0

    Welcome 来了
    Wild Worlds of MQL

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

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

    MQL -side还需要允许所有DLL调用,请检查MetaTrader Terminal 5设置:
    [x]允许DLL导入....


    语法问题:逐项检查calling-signature(s)

    MQL 文档说明了要使用 MessageBox() 的单个明确的呼叫签名:

    int MessageBox(字符串文本,//消息文本字符串caption = NULL,// box header intflags = 0); //在框中定义按钮组参数:text:[in] Text,包含要输出的消息 . caption = NULL:[in]要在框 Headers 中显示的可选文本 . 如果参数为空,则EA Headers 中将显示“EA交易”名称 . flags = 0:[in]定义消息框的外观和行为的可选标志 . 标志可以是一组特殊标志的组合 . (加号:默认值== 0 == MB_OK)返回值:如果函数成功执行,则返回的值是MessageBox()返回码的值之一 . (其中包括:{IDOK | IDCANCEL | IDABORT | IDRETRY | IDIGNORE | IDYES | IDNO | IDTRYAGAIN | IDCONTINUE})


    MQL不是C#MQL-string实际上不是一个字符串,但结构MQL不能原谅任何一个细微的细节:应该小心谨慎:

    MQL 文件说明:

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

    #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)
    

    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解析器作为绿地项目更快地实现目标 .

相关问题