如何通过引用从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);
}
但我没有得到任何值从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
标志,传递的数组是一个长度未定义的静态数组;应该使用一个额外的参数来指定数组的大小。
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 如何将enable-if与模板参数和参数包一起使用