【问题标题】:How to fix serialization problems MQL4?如何解决 MQL4 的序列化问题?
【发布时间】:2016-06-22 12:15:00
【问题描述】:

今天我在 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 序列化时的值。 为什么?

【问题讨论】:

    标签: c++ dll mql4 metatrader4 metatrader5


    【解决方案1】:

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

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

    【讨论】:

    • 是的,Joseph,+1 指出三重 c-long 未对齐读取只是 MQL4-long times[3] 内存的前三个部分,因此从从第一个 19991208 开始的高 32 位。
    • 谢谢你,约瑟夫,你真的帮了我:)
    【解决方案2】:

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

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

    由于 old-MQL4 已被默默地重新定义为仍在 WIP 爬行的语法 New-MQL4

    MQL4 字符串 不是string,而是struct


    根本原因[隔离]:

    吞下了关于string/struct 麻烦的震惊,如果可以,首先尝试测试MQL4/DLL 交互,而不传递任何string 来证明所有其他参数,按值传递并通过引用解决,如您所愿,请务必使用DLL-function。

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

    那么如何将数据传递给预期的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 等。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-12
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多