今天我在 MQL4
中遇到序列化问题。
我有一个方法,我从 DLL
导入:
MQL4:
void insertQuery( int id,
string tableName,
double &values[4],
long ×[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
值。的为什么吗
答案 0 :(得分:2)
问题是因为在MQL4中,long
是8个字节,而C ++中的long
是4个字节。
long long
。答案 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
等。