如何从 [ MQL5 ] 代码调用 DLL 文件中的函数?
How to call a function from a DLL file from [ MQL5 ] code?
为什么第一个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 );
}
欢迎来到
狂野
MQL
[=60=的世界]
如何测试 DLL 函数调用访问?
这是最简单的部分。从内部测试 DLL
。添加一些 input/output parameters/values 在 stdout
上打印到每个 DLL
函数源中,在调试阶段你有所有需要的C#
那里涵盖了端自诊断。
MQL
端还需要允许所有 DLL 调用,检查 MetaTrader Terminal 5 设置:
[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]
Text, containing message to output.
caption
= NULL : [in]
Optional text to be displayed in the box header. If the parameter is empty, Expert Advisor name is shown in the box header.
flags
= 0 : [in]
Optional flags defining appearance and behavior of a message box. Flags can be a combination of a special group of flags. ( Plus: Default value == 0 == MB_OK
)
Return Value :
If the function is successfully performed, the returned value is one of values of MessageBox()
return codes. ( Which are: { IDOK | IDCANCEL | IDABORT | IDRETRY | IDIGNORE | IDYES | IDNO | IDTRYAGAIN | IDCONTINUE }
)
MQL
不是 C#
MQL
-string 实际上不是 string
,而是 struct
MQL
不放过任何一个小细节:
谨慎是必须的:
MQL
文档说明:
Internal representation of the string type is a structure of 12 bytes long:
#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
第一次调用成功的原因。
MessageBox()
没有尝试访问它的任何内存位置调用,作为伪造的 MQL-string-struct (ill)- 通过 .size
struct-component 自己声明的它自己的 .buffer
内存区域(间接寻址)长度为 0 字节,因此 没有内存区域(根据定义,最终与某个其他内存对象的地址space发生冲突)将在这种特定情况下访问。
在 MQL
领域工作了十多年之后,拥有超过数百人 * 年的团队实践经验 MQL
语言语法,我敢说,"do not rely on no errors being reported in a compilation phase"、MetaTrader Terminal 在很多情况下都让我们脱颖而出,即使代码是逐字逐句地遵循已发布的文档。
随时查看 MQL 上的其他帖子,了解有关 DLL 集成噩梦的更多详细信息以及有关进入分布式处理的好故事,GPGPU
-computing et其他
关于 JSON
的最后评论
如果我要设计一个通过 JSON
进行通信的架构,我会加入 ZeroMQ DLL
分布式处理服务,这将使您的目标成为现实比只构建另一个 JSON-parser 作为全新项目要快得多。
为什么第一个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 );
}
欢迎来到
狂野MQL
[=60=的世界]
如何测试 DLL 函数调用访问?
这是最简单的部分。从内部测试 DLL
。添加一些 input/output parameters/values 在 stdout
上打印到每个 DLL
函数源中,在调试阶段你有所有需要的C#
那里涵盖了端自诊断。
MQL
端还需要允许所有 DLL 调用,检查 MetaTrader Terminal 5 设置:[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]
Text, containing message to output.
caption
= NULL : [in]
Optional text to be displayed in the box header. If the parameter is empty, Expert Advisor name is shown in the box header.
flags
= 0 : [in]
Optional flags defining appearance and behavior of a message box. Flags can be a combination of a special group of flags. ( Plus: Default value == 0 ==MB_OK
)
Return Value :
If the function is successfully performed, the returned value is one of values ofMessageBox()
return codes. ( Which are:{ IDOK | IDCANCEL | IDABORT | IDRETRY | IDIGNORE | IDYES | IDNO | IDTRYAGAIN | IDCONTINUE }
)
MQL
不是 C#
MQL
-string 实际上不是 string
,而是 struct
MQL
不放过任何一个小细节:
谨慎是必须的:
MQL
文档说明:
Internal representation of the string type is a structure of 12 bytes long:
#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
第一次调用成功的原因。
MessageBox()
没有尝试访问它的任何内存位置调用,作为伪造的 MQL-string-struct (ill)- 通过 .size
struct-component 自己声明的它自己的 .buffer
内存区域(间接寻址)长度为 0 字节,因此 没有内存区域(根据定义,最终与某个其他内存对象的地址space发生冲突)将在这种特定情况下访问。
在 MQL
领域工作了十多年之后,拥有超过数百人 * 年的团队实践经验 MQL
语言语法,我敢说,"do not rely on no errors being reported in a compilation phase"、MetaTrader Terminal 在很多情况下都让我们脱颖而出,即使代码是逐字逐句地遵循已发布的文档。
随时查看 MQL 上的其他帖子,了解有关 DLL 集成噩梦的更多详细信息以及有关进入分布式处理的好故事,GPGPU
-computing et其他
关于 JSON
的最后评论
如果我要设计一个通过 JSON
进行通信的架构,我会加入 ZeroMQ DLL
分布式处理服务,这将使您的目标成为现实比只构建另一个 JSON-parser 作为全新项目要快得多。