繁体   English   中英

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

[英]How to pass argument by reference from MQL4 to C++ DLL

我试图在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 ++函数中获得任何价值。有人可以帮我解决我在这里做错了什么吗?

提前致谢

让我们从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 ++编写的程序的源文本中,使用特定于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
                                      );

}

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

最后,MQL4文档说明:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM