[英]MQL4 C++ Dll change string argument in function call
这是我的MetaTraderWrapper.dll
代码:
#define MT4_EXPFUNC __declspec(dllexport)
MT4_EXPFUNC void __stdcall PopMessageString(wchar_t *message)
{
auto result = L"Hello world !";
int n = wcslen( result );
wcscpy_s( message, n + 1, result );
}
在MQL4-Caller端,使用此脚本:
#property strict
#import "MetaTraderWrapper.dll"
int PopMessageString( string & );
#import
//
void OnStart(){
string message;
if ( StringInit( message, 64 ) ){
PopMessageString( message );
int n = StringLen( message );
MessageBox( message );
}
}
这样,当使用StringInit()
函数正确初始化了一条message
并分配了足够的内存时,它就可以工作。
我需要做的是,不是在MQL4脚本中而是在DLL中分配message
变量。
在c ++函数中,应如下所示:
MT4_EXPFUNC void __stdcall PopMessageString(wchar_t *message)
{
auto result = L"Hello world !";
int n = wcslen( result );
// allocate here, but does not work
message = new wchar_t[n + 1]; // <--------- DOES NOT WORK
//
wcscpy_s( message, n + 1, result );
}
我能做什么 ?
string
为string
(这是一个struct
...从2014年开始) 字符串类型的内部表示是一个12字节长的结构:
#pragma pack(push,1) struct MqlString { int size; // 32-bit integer, contains size of the buffer, allocated for the string. LPWSTR buffer; // 32-bit address of the buffer, containing the string. int reserved; // 32-bit integer, reserved. }; #pragma pack(pop,1)
所以,
进入这个阳光明媚的星期日下午后,该平台经历了LiveUpdate,突然所有使用字符串的DLL调用接口都停止了工作,因此花了很长的路才能吸收这种“迅捷”的工程惊喜的成本。
您可以重复使用找到的解决方案:
使用字节数组uchar[]
并通过服务函数StringToCharArray()
分别将MQL4端返回的内容的相应字节转换为string
。 CharArrayToString()
DLL- .mqh
-header文件也可以添加以下技巧,并使这些转换从MQL4代码“隐藏”:
#import <aDLL-file> // "RAW"-DLL-call-interfaces
...
// Messages:
int DLL_message_init( int &msg[] );
int DLL_message_init_size ( int &msg[], int size );
int DLL_message_init_data ( int &msg[], uchar &data[], int size );
...
#import
// ------------------------------------------------------ // "SOFT"-wrappers
...
int MQL4_message_init_data ( int &msg[], string data, int size ) { uchar dataChar[]; StringToCharArray( data, dataChar );
return ( DLL_message_init_data ( msg, dataChar, size ) );
}
始终要谨慎处理适当的释放,以免引起内存泄漏。
当新的LiveUpdate更改代码库并引入新的编译器+新文档时,请务必保持谨慎。 重新阅读整个文档,因为许多救生细节仅在下一次更新后才进入帮助文件,并且许多细节被隐藏或间接反映在各章中,因此这些信息乍一看并不能保证这些信息。准备好成为达达纳哥(D'Artagnan)还是红头巾的先驱-永远不会知道,下一个热门来自何处
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.