我试图在MQL4中编写一个简单的程序,该程序通过引用将变量传递给C ++ DLL函数,并在MQL4中打印更新的变量值。下面是我的代码。
DLL功能:
void Test(int* X)
{
*X = 6;
}
Run Code Online (Sandbox Code Playgroud)
MQL4代码
#import "Test.dll"
void Test(int&);
#import
void OnStart()
{
int A;
Test(A);
Alert(A);
}
Run Code Online (Sandbox Code Playgroud)
但是我没有从C ++函数中获取变量A的任何价值。有人可以帮助我在这里做错什么吗?
提前致谢
int TestMoreApproachesAtONCE( int *X,\n int *Y,\n int Z\n )\n{\n *X = 6; // 6 assigned to a 4B-memory chunk ref\'d by *X\n Y = 6; // 6 assigned to a variable Y\n return( Z ); // Z returned as a value passed from Caller\n}\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n将 DLL 导入 mql4 程序的函数必须确保 Windows API 调用协议。为了确保这样的协议,在用 C 或 C++ 编写的程序的源文本中,使用
\n__stdcall特定于 Microsoft(r) 编译器的关键字 。该协议具有以下特点:
\xc2\xb7 调用者(在我们的例子中是一个 mql4 程序)应该“看到”被调用函数的原型(从 DLL 导入),以便正确地将参数组合到堆栈中;
\xc2\xb7 调用者(在我们的例子中是一个 mql4 程序)以相反的顺序(从右到左)将参数放入堆栈 - 按照此顺序,导入的函数读取传递给它的参数;
\xc2\xb7 参数按值传递,除了那些通过引用显式传递的参数(在我们的例子中是字符串),
\xc2\xb7导入的函数通过读取传递给它的参数来独立地清理堆栈。
在描述导入函数的原型时,可以使用默认参数。
如果相应的库无法加载,或者禁止使用 DLL,或者找不到导入的函数 - Expert Advisor 会停止其操作,并在日志(日志文件)中显示相应的消息“Expert Advisor 已停止”。在这种情况下,EA 交易在重新初始化之前不会运行。EA 交易可以因重新编译而重新初始化,或者在打开其属性表并按下“确定”后重新初始化。
#import "Test.dll" // -----------------------------------------------\n\n void Test( int& );\n\n int TestMoreApproachesAtONCE( int &X,\n int &Y,\n int Z\n );\n#import // "Test.dll" // ----------------------------------------------- \n\nvoid OnStart()\n{\n int A = EMPTY,\n B = EMPTY,\n C = EMPTY;\n // ---------------------------------------------------<PRE>\n Print( " TEST:: inital values are: A = ", A,\n " B = ", B,\n " C = ", C\n );\n // ---------------------------------------------------<TEST>\n\n C = TestMoreApproachesAtONCE( A, B, 6 );\n\n // ---------------------------------------------------<POST>\n Print( " TEST:: final values are: A = ", A,\n " B = ", B,\n " C = ", C\n );\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n不管怎样,享受 MQL4 的狂野世界——也可能喜欢点击并阅读有关 MQL4/DLL 集成和/或 MQL4 域中的信号/消息传递问题的其他帖子。欢迎询问更多
\n\n\n\n传递参数
\n
简单类型的所有参数均按值传递,除非明确指示它们是按引用传递。当传递一个字符串时,传递的是复制的字符串的缓冲区的地址;如果通过引用传递字符串,则该字符串的缓冲区地址而不进行复制,将传递给从 DLL 导入的函数。
包含动态数组、字符串、类、其他复杂结构的结构以及枚举对象的静态或动态数组不能作为参数传递给导入的函数。
将数组传递给 DLL 时,始终传递数据缓冲区的开头地址(无论标志如何AS_SERIES)。DLL 中的函数对AS_SERIES标志一无所知,传递的数组是未定义长度的静态数组;应使用附加参数来指定数组大小。