如何修复MQL4的序列化问题?

时间:2016-06-22 12:15:01

标签: c++ dll mql4 metatrader4 metatrader5

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

所以我的问题是:当我在long收到记录时,为什么我在数组中丢失了一个 DLL 值?

我尝试了很多方法来解决这个问题(我转移了两个和三个long值等)和总是我得到的结果是我输了第二个 long值。的为什么吗

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

好吧,小心点, 新 - MQL4.56789 不是c兼容语言

要测试的第一件事是避免将 MQL4 string 传递到DLL调用界面,其中真正需要c-lang string

由于旧版本MQL4已被静默地重新定义为仍然在制作HTML的语法新建 - MQL4,所以 {{ 1}} 字符串 不是 MQL4,而是 string

根本原因[隔离]:

如果可以的话,已经消除了struct麻烦的冲击,首先尝试测试string/struct互动而不通过任何MQL4/DLL证明,其他参数,按值传递并由-ref表示,确实可以按照您的预期到达string - 函数。

如果按照您的意愿工作,请继续执行下一步:

如何将这些数据传递给预期的DLL表示,然后呢?

让我分享一下我用来传递string期望DLL的数据的肮脏黑客 - s

string

是的,很脏,但多年来一直工作并为我们节省了数十年的重新设计时间,这些代码库依赖于大规模分布式异构计算系统中的#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等。