以下是 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 );
}
}
通过这种方式,当 message
已使用 StringInit()
功能正确初始化并且已分配足够的内存时,它可以正常工作。
我需要做的是,分配不在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 );
}
我该怎么办?
答案 0 :(得分:0)
string
为string
(自{2014年起为struct
...) 子> 字符串类型的内部表示是一个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[]
,并通过服务函数将MQL4端返回内容的字节转换为 string
StringToCharArray()
resp。的 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或红色先锋 - 你永远不知道,下一个打击来自哪里:)