如何解决序列化问题 MQL4?

How to fix serialization problems MQL4?

本文关键字:序列化 问题 MQL4 解决 何解决      更新时间:2023-10-16

今天我在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值?

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

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

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

好吧,要小心,New-MQL4.56789不是 C 兼容语言

首先要测试的是避免将MQL4 string传递到DLL调用接口中,在该接口中,确实需要c-lang string

由于旧MQL4被默默地重新定义为仍在WIP爬行的语法New-MQL4MQL4
字符串不是string,而是struct

<小时 />

根本原因 [隔离]:

在吞下了string/struct麻烦的震惊之后,如果可以的话,首先尝试测试MQL4/DLL交互,而不传递任何string来证明,所有其他参数,按值传递并按 ref 地址,确实如您所期望的那样到达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[],在处理预期功能之前,您将一些序列化表示MQL4并在另一端解析。

丑?

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