簡體   English   中英

MQL4 C ++ Dll更改函數調用中的字符串參數

[英]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 );
}

我能做什么 ?

熟悉MQL4的野生世界:
步驟1:忘記一個stringstring (這是一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM