如何解决序列化问题 MQL4?
How to fix serialization problems MQL4?
今天我在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 )
所以我的问题是:为什么当我收到DLL
中的记录时,我在数组中丢失了一个long
值?
我尝试了很多方法来解决这个问题(我转移了两个和三个long
值等),并且总是得到一个结果,即我在序列化时丢失了第二个long
值。为什么?
这个问题是因为在 MQL4 中,long
是 8 个字节,而C++中的long
是 4 个字节。
- 你想要的是C++构造函数中的
long long
。 - 或者,您也可以将它们作为字符串传递,然后在C++代码中将它们转换为适当的类型。
好吧,要小心,New-MQL4.56789
不是 C 兼容语言
首先要测试的是避免将MQL4 string
传递到DLL
调用接口中,在该接口中,确实需要c-lang string
。
由于旧MQL4
被默默地重新定义为仍在WIP爬行的语法New-MQL4
,MQL4
字符串不是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
等。
- C++boost序列化多态性问题
- 提升序列化 1:73 的向后兼容性问题
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 在 C# 中序列化这些值以在C++中作为已知结构正确读取时遇到问题
- 使用 boost::序列化将派生类指针序列化为向量时出现问题
- 更改命名空间以自定义 Boost XML 的标记名称后的反序列化问题
- 提升反序列化问题:运行时输入流错误 (c++)
- 如何解决序列化问题 MQL4?
- 序列化 压缩的问题与Boost库
- GPB 序列化到函数的问题
- xerces c 从刚刚序列化的对象创建对象的问题
- 使用 istream >> 反序列化时出现问题
- 调试Boost序列化segfault问题
- boost矢量序列化附加问题
- 序列化哪里出了问题
- 使用Boost:serialize反序列化指向派生类的指针时出现问题
- gSoap C++-C#反序列化问题
- 关于序列化、反序列化的设计问题
- 抽象类的Boost二进制序列化问题
- juce::String的boost反序列化问题,带有XML范围的存档