如何通过引用从MQL4传递参数到c++ DLL

How to pass argument by reference from MQL4 to C++ DLL

本文关键字:参数 c++ DLL 何通过 引用 MQL4      更新时间:2023-10-16

我试图在MQL4中编写一个简单的程序,该程序通过引用将变量传递给c++ DLL函数,并在MQL4中打印更新的变量值。下面是我的代码。

DLL函数:

void Test(int* X)
{
    *X = 6;
}

MQL4代码

#import "Test.dll"
void Test(int&);
#import
void OnStart()
{
  int A;
  Test(A);
  Alert(A);
}

但我没有得到任何值从c++函数变量a回来有人能帮我我在这里做错了什么?

Thanks in advance

让我们从dll端开始:

int TestMoreApproachesAtONCE( int *X,
                              int *Y,
                              int  Z
                              )
{
    *X = 6;                   // 6 assigned to a 4B-memory chunk ref'd by *X
     Y = 6;                   // 6 assigned to a variable  Y
     return( Z );             // Z returned as a value passed from Caller
}

MQL4要求DLL具有:

将DLL导入mql4程序的函数必须确保Windows API调用协议。为了确保这种一致性,在用C或c++编写的程序的源文本中,使用关键字 __stdcall ,这是特定于Microsoft(r)编译器的。该协议的特点如下:

·调用者(在我们的情况下,它是mql4程序)应该"看到"调用函数的原型(从DLL导入),以便正确地将参数组合到堆栈中;

(在我们的情况下,它是mql4程序)将参数以相反的顺序放入堆栈中;

·参数是按值传递的,除了那些显式通过引用传递的参数(在我们的例子中是字符串)

·导入的函数通过读取传递给它的参数独立地清理堆栈。

在描述导入函数的原型时,可以使用默认参数。

如果相应的库无法加载,或者禁止使用DLL,或者没有找到导入的函数- Expert Advisor停止其操作,并在日志(日志文件)中显示相应的消息"Expert Advisor stopped"。在这种情况下,在重新初始化之前,Expert Advisor将不会运行。Expert Advisor可以在重新编译或打开其属性表并按OK键后重新初始化。

现在演示MQL4端:

#import    "Test.dll" // -----------------------------------------------
                         void Test( int& );
                         int  TestMoreApproachesAtONCE( int &X,
                                                        int &Y,
                                                        int  Z
                                                        );
#import // "Test.dll" // -----------------------------------------------    
void OnStart()
{
     int A = EMPTY,
         B = EMPTY,
         C = EMPTY;
  // ---------------------------------------------------<PRE>
     Print( " TEST:: inital values are: A = ", A,
                                      " B = ", B,
                                      " C = ", C
                                      );
  // ---------------------------------------------------<TEST>
     C = TestMoreApproachesAtONCE( A, B, 6 );
  // ---------------------------------------------------<POST>
     Print( " TEST::  final values are: A = ", A,
                                      " B = ", B,
                                      " C = ", C
                                      );
}

无论如何,享受MQL4的狂野世界——也可以点击并阅读关于MQL4/DLL集成和/或MQL4域中的信令/消息传递问题的其他帖子。请随意提问

最后,MQL4 Documentation声明:

传递形参
所有简单类型的形参都是通过值传递的,除非明确指出它们是通过引用传递的。当传递字符串时,将传递复制字符串的缓冲区地址;如果一个字符串是通过引用传递的,那么这个字符串的缓冲区的地址(不复制它)将被传递给从DLL导入的函数。

包含动态数组、字符串、类、其他复杂结构以及枚举对象的静态或动态数组的结构体不能作为参数传递给导入的函数。

当将数组传递给DLL时,总是传递数据缓冲区开始的地址(与AS_SERIES标志无关)。DLL中的函数不知道AS_SERIES标志,传递的数组是一个长度未定义的静态数组;应该使用一个额外的参数来指定数组的大小。