1

今天我在MQL4.

我有一个方法,我从 a 导入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值。为什么?

4

2 回答 2

2

问题是因为在 MQL4 中,along是 8 字节,而longC++ 中的 a 是 4 字节。

  1. 你想要的是long long你的 C++ 构造函数中的一个。
  2. 或者您也可以将它们作为字符串传递,然后在您的 C++ 代码中将它们转换为适当的类型。
于 2016-06-25T16:59:01.903 回答
0

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

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

由于 old-MQL4已被无声地重新定义为仍在 WIP 爬行的语法New-MQL4
因此字符串不是a ,而是 a 。MQL4 stringstruct


根本原因[隔离]:

吞下关于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[]根据需要传递 a,在其中组装一些序列化的表示MQL4并在另一端解析它,然后再处理预期的功能。

丑陋的?

是的,可能看起来像那样,

让你专注于核心功能,并将你与任何下一次范式转变隔离开来,如果不仅strings不再是strings等人的话。

于 2016-06-23T12:59:02.173 回答