为什么第一个 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 );
}
答案 0 :(得分:0)
欢迎加入狂野世界MQL
这是最简单的部分。从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解析器作为绿地项目。