C++ 如何修复序列化问题MQL4?

C++ 如何修复序列化问题MQL4?,c++,dll,mql4,metatrader4,metatrader5,C++,Dll,Mql4,Metatrader4,Metatrader5,今天,我在MQL4中遇到了序列化问题 我有一个方法,是从DLL导入的: 在MQL4: void insertQuery( int id, string tableName, double &values[4], long &times[3], int volume ); __de

今天,我在
MQL4
中遇到了序列化问题

我有一个方法,是从
DLL
导入的:

MQL4:

void insertQuery( int     id,
                  string  tableName,
                  double &values[4],
                  long   &times[3],
                  int     volume
                  );
__declspec(dllexport) void __stdcall insertQuery( int      id,
                                                  wchar_t *tableName,
                                                  double  *values,
                                                  long    *times,
                                                  int      volume
                                                  );
string a      = "bla";
double arr[4] = { 1.1, 1.3, 0.2, 0.9 };
long     A[3] = { 19991208, 19991308, 19992208 };
int volume    = 1;
insertQuery( idDB, a, arr, A, volume );
DLL中:

void insertQuery( int     id,
                  string  tableName,
                  double &values[4],
                  long   &times[3],
                  int     volume
                  );
__declspec(dllexport) void __stdcall insertQuery( int      id,
                                                  wchar_t *tableName,
                                                  double  *values,
                                                  long    *times,
                                                  int      volume
                                                  );
string a      = "bla";
double arr[4] = { 1.1, 1.3, 0.2, 0.9 };
long     A[3] = { 19991208, 19991308, 19992208 };
int volume    = 1;
insertQuery( idDB, a, arr, A, volume );
我在
MQL4:

void insertQuery( int     id,
                  string  tableName,
                  double &values[4],
                  long   &times[3],
                  int     volume
                  );
__declspec(dllexport) void __stdcall insertQuery( int      id,
                                                  wchar_t *tableName,
                                                  double  *values,
                                                  long    *times,
                                                  int      volume
                                                  );
string a      = "bla";
double arr[4] = { 1.1, 1.3, 0.2, 0.9 };
long     A[3] = { 19991208, 19991308, 19992208 };
int volume    = 1;
insertQuery( idDB, a, arr, A, volume );
在这个方法中,我将这些值收集到文件中

C++

stringstream stream;
stream << " '";
for (int i = 0; i < 2; ++i) {
    stream << times[i] << "' , '";
}
stream << times[2] << ", ";

for (int i = 0; i < 4; ++i) {
    stream << values[i] << ", ";
}

stream << volume;
wstring table(tableName);
query.append("INSERT INTO ");
query.append(table.begin(), table.end());
query.append(" VALUES (");
query.append(stream.str());
query.append(" )");

std::ofstream out("C:\\Users\\alex\\Desktop\\text.txt");
out << query;
out.close();
所以我的问题是:当我在
DLL
中收到记录时,为什么我会在数组中丢失一个
long

我尝试了很多方法来解决这个问题(我传输了两个和三个
long
值等),并且总是我得到的结果是在序列化时丢失了
long
为什么?

好吧,小心点,新的-
MQL4.56789
不是c兼容的语言 要测试的第一件事是避免将
MQL4字符串
传递到
DLL
调用接口,在该接口中实际需要
c-lang字符串

由于旧的-
MQL4
被悄悄地重新定义为一种仍在运行的新语法-
MQL4

MQL4
字符串不是
字符串,而是
结构


根本原因[隔离]: 在经历了关于
string/struct
问题的震惊之后,如果可以的话,首先尝试测试
MQL4/DLL
交互,而不传递任何
string
来证明所有其他参数都是按值传递和按ref寻址的,按照您的期望,一定要使用
DLL
-函数

如果这符合您的要求,请转至下一步:

那么,如何将这些数据传递到预期的
字符串
表示?
让我来分享一个我用来传递数据的肮脏的黑客,其中
DLL
需要
string
-s

#import     "mql4TOOL.dll"
               ...
               int      mql4TOOL_msg_init_data ( int   &msg[],
                                                 uchar &data[],
                                                 int    size
                                                 );
               ...
#import
...
int                tool_msg_init_data ( int &msg[], string data, int size ) {  uchar dataChar[]; StringToCharArray( data, dataChar );
      return ( mql4TOOL_msg_init_data (      msg,          dataChar, size ) );
   }
是的,肮脏,但可以工作数年,并在大规模分布式异构计算系统中严重依赖
MQL4/DLL
接口的维护代码库上为我们节省了数十年的重新设计时间

最后手段: 如果所有的努力都白费了,请转到低级别,根据需要传递一个
uchar[]
,在处理预期功能之前,在
MQL4
中组装一些序列化表示,并在另一端解析它

丑陋?
是的,可能看起来是这样的,
但是
让您专注于核心功能,并且将您与任何下一次范式转变隔离开来如果不仅仅
字符串不再是
字符串等。

问题是因为在MQL4中,
是8字节,C++中的<代码>长是4字节。

你想要的是C++构造函数中的<代码>长Le/Obj>。< /LI> 或您也可以作为字符串传递它们,然后将它们转换成C++代码中的适当类型。
你可能还想在
MQL4
/
SER/DES
issues>>上发表另一篇博文,是的,约瑟夫,+1指出了三个
c-long
错误对齐,只读取
MQL4 long times[3]
内存的前三部分,从而从第一个
19991208
内存的上32位取零。谢谢你,约瑟夫,你真是帮了我的忙:)