我正在尝试在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 ++函数中获得任何价值。有人可以帮我解决我在这里做错了吗?
提前致谢
答案 0 :(得分:1)
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程序中的函数必须确保Windows API调用协议。为确保达成此类协议,请在使用C或C ++编写的程序的源文本中,使用特定于Microsoft(r)编译器的关键字
__stdcall
。本协议的特点如下:
· 来电(在我们的案例中,它是一个mql4程序)应该“看到”一个名为(从DLL导入)的函数的原型,以便将参数正确地组合到堆栈中;
· 调用者(在我们的例子中是一个mql4程序)从右到左以相反的顺序将参数放入堆栈 - 按此顺序,导入的函数读取传递给它的参数;
· 参数按值传递,但通过引用显式传递的除外(在我们的示例中为字符串)
· 导入函数通过读取传递给它的参数来独立清理堆栈。
在描述原型时一个导入的函数,可以使用默认参数。
如果相应的库无法加载,或者禁止使用DLL ,或找不到导入的功能 - Expert Advisor在日志(日志文件)中使用相应的消息“Expert Advisor stopped”停止其操作。在这种情况下,EA会在重新初始化之前不会运行。重新编译时,或者在打开其属性表并按下“确定”后,可以重新初始化“EA交易”。
#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
);
}
传递参数
简单类型的所有参数都按值传递,除非明确指出它们是通过引用传递的。传递字符串时,传递复制字符串的缓冲区地址;如果一个字符串是通过引用传递的,则该字符串的缓冲区地址不会复制它传递给从DLL导入的函数。
包含动态数组,字符串,类,其他复杂结构的结构,以及枚举对象的静态或动态数组,不能作为参数传递给导入的函数。
当将数组传递给DLL时,数据缓冲区开头的地址是总是通过(不论AS_SERIES
标志)。 DLL中的函数对AS_SERIES
标志一无所知,传递的数组是未定义长度的静态数组;应使用附加参数来指定数组大小。