1

为什么第一个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 );
    }
4

1 回答 1

3

欢迎来到
野生
世界MQL

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

这是最简单的部分。从内部测试它DLL。将一些输入/输出参数/值打印stdout到每个DLL-function 源中,并且在调试阶段,您已经涵盖了所有需要的C#-side 自诊断。

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


语法问题:逐项检查调用签名

MQL文档说明了要使用的单一、清晰的呼号MessageBox()

int MessageBox(
string text, // message text
string caption = NULL, // box header
intflags = 0); // defines set of buttons in the box

Parameters :
text: [in]文本,包含要输出的消息。要在框标题中显示的可选文本。如果参数为空,EA 交易名称将显示在框标题中。定义消息框外观和行为的可选标志。标志可以是一组特殊标志的组合。加:默认值 == 0 ==如果函数执行成功,返回值是返回码值之一。它们:)

caption= NULL : [in]

flags= 0 : [in] MB_OK

Return Value :
MessageBox(){ IDOK | IDCANCEL | IDABORT | IDRETRY | IDIGNORE | IDYES | IDNO | IDTRYAGAIN | IDCONTINUE }


MQLis not C#
MQL-string is not astring事实上,但 a不能原谅任何一个微小的细节:必须小心谨慎struct
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)

这就是The Strange Answer为什么第一个电话有效的原因。没有尝试访问它调用的任何内存位置,因为伪造的 MQL-string-struct (ill)-通过 struct-component 自己声明,
它自己的内存区域(间接寻址)长度为 0 字节,因此在这种特定情况下,不会访问任何内存区域(根据定义,最终会与其他内存对象的地址空间发生冲突) 。MessageBox().size.buffer

MQL领域工作了十多年,拥有数百人*年的团队实践经验MQL,我敢说,“不要指望在编译阶段没有报告错误”MetaTrader Terminal已经做出了在许多情况下,即使代码逐字遵循已发布的文档,我们也没有毛病。

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


最后的评论JSON

如果我要设计一个架构来进行通信,JSON我会加入ZeroMQ DLL分布式处理服务,这将使你的目标更快,而不是仅仅构建另一个 JSON 解析器作为一个新项目。

于 2016-04-26T11:05:27.343 回答