繁体   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