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

时间:2016-09-15 21:57:07

标签: c++ dll mql4

我正在尝试在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);
}

但是我没有从变量A的C ++函数中获得任何价值。有人可以帮我解决我在这里做错了吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

让我们从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具有:

  

将函数导入到mql4程序中的函数必须确保Windows API调用协议。为确保达成此类协议,请在使用C或C ++编写的程序的源文本中,使用特定于Microsoft(r)编译器的关键字 __stdcall 。本协议的特点如下:

· 来电(在我们的案例中,它是一个mql4程序)应该“看到”一个名为(从DLL导入)的函数的原型,以便将参数正确地组合到堆栈中;

· 调用者(在我们的例子中是一个mql4程序)从右到左以相反的顺序将参数放入堆栈 - 按此顺序,导入的函数读取传递给它的参数;

· 参数按值传递,但通过引用显式传递的除外(在我们的示例中为字符串)

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

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

如果相应的库无法加载,或者禁止使用DLL ,或找不到导入的功能 - Expert Advisor在日志(日志文件)中使用相应的消息“Expert Advisor stopped”停止其操作。在这种情况下,EA会在重新初始化之前不会运行。重新编译时,或者在打开其属性表并按下“确定”后,可以重新初始化“EA交易”。

现在演示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
                                      );

}

Anyway, enjoy the Wild Worlds of MQL4 -- Also may enjoy to click and read other posts on issues in MQL4/DLL integration and/or signalling/messaging in MQL4 domains. Feel free to ask more

最后,MQL4文档声明:

  

传递参数
简单类型的所有参数都按值传递,除非明确指出它们是通过引用传递的。传递字符串时,传递复制字符串的缓冲区地址;如果一个字符串是通过引用传递的,则该字符串的缓冲区地址不会复制它传递给从DLL导入的函数。

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

当将数组传递给DLL时,数据缓冲区开头的地址是总是通过(不论AS_SERIES标志)。 DLL中的函数对AS_SERIES标志一无所知,传递的数组是未定义长度的静态数组;应使用附加参数来指定数组大小。