[英]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.