如何修复序列化问题 MQL4?

How to fix serialization problems MQL4?

今天我在 MQL4.

中遇到序列化问题

我有一个方法,我从 DLL:

MQL4:

void insertQuery( int     id,
                  string  tableName,
                  double &values[4],
                  long   &times[3],
                  int     volume
                  );

DLL:

__declspec(dllexport) void __stdcall insertQuery( int      id,
                                                  wchar_t *tableName,
                                                  double  *values,
                                                  long    *times,
                                                  int      volume
                                                  );

我在 MQL4:

中用这个函数调用测试了它
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();

但是在输出文件中我收到了这条记录:

INSERT INTO bla VALUES ( '19991208' , '0' , '19991308, 1.1, 1.3, 0.2, 0.9, 1 )

所以我的问题是: 为什么当我在 DLL?

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

嗯,小心点,New-MQL4.56789 不是 c 兼容语言

要测试的第一件事是避免将 MQL4 string 传递到 DLL 调用接口,而实际上 c-lang string 是预期的。

因为 old-MQL4 已经悄悄地被重新定义为一个仍在开发中的语法 New-MQL4,
MQL4 字符串 不是一个string,而是一个struct.


根本原因[隔离]:

在吞下 string/struct 麻烦的震惊之后,如果可以的话,首先 尝试测试 MQL4/DLL 交互而不通过任何 string证明所有其他参数,按值传递并按引用寻址,确实如您所料到达DLL-函数的手中。

如果如您所愿,请继续下一步:

那么如何将数据传递给预期的 string 表示呢?

让我分享一个我用来传递 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[],您 assemble 在 [=15 中的一些序列化表示=] 并在另一端解析它,然后再处理预期的功能。

丑?

是的,可能看起来像那样,
但是
让你专注于核心功能并且让你远离任何下一个范式转变如果不仅strings不再是strings

问题是因为在 MQL4 中,long 是 8 个字节,而 C++ 中的 long 是 4 个字节。

  1. 您需要的是 C++ 构造函数中的 long long
  2. 或者您也可以将它们作为字符串传递,然后在您的 C++ 代码中将它们转换为适当的类型。