如何修复序列化问题 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
值等)并且 总是 我得到的结果是我输了 second long
序列化时的值。 为什么?
嗯,小心点,New-MQL4.56789
不是 c 兼容语言
要测试的第一件事是避免将 MQL4 string
传递到 DLL
调用接口,而实际上 c-lang string
是预期的。
因为 old-MQL4
已经悄悄地被重新定义为一个仍在开发中的语法 New-MQL4
,
MQL4
字符串 不是一个string
,而是一个struct
.
根本原因[隔离]:
在吞下 string/struct
麻烦的震惊之后,如果可以的话,首先 尝试测试 MQL4/DLL
交互而不通过任何 string
证明所有其他参数,按值传递并按引用寻址,确实如您所料到达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[]
,您 assemble 在 [=15 中的一些序列化表示=] 并在另一端解析它,然后再处理预期的功能。
丑?
是的,可能看起来像那样,
但是
让你专注于核心功能并且让你远离任何下一个范式转变如果不仅strings
不再是strings
等
问题是因为在 MQL4 中,long
是 8 个字节,而 C++ 中的 long
是 4 个字节。
- 您需要的是 C++ 构造函数中的
long long
。
- 或者您也可以将它们作为字符串传递,然后在您的 C++ 代码中将它们转换为适当的类型。
今天我在 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
值等)并且 总是 我得到的结果是我输了 second long
序列化时的值。 为什么?
嗯,小心点,New-MQL4.56789
不是 c 兼容语言
要测试的第一件事是避免将 MQL4 string
传递到 DLL
调用接口,而实际上 c-lang string
是预期的。
因为 old-MQL4
已经悄悄地被重新定义为一个仍在开发中的语法 New-MQL4
,
MQL4
字符串 不是一个string
,而是一个struct
.
根本原因[隔离]:
在吞下 string/struct
麻烦的震惊之后,如果可以的话,首先 尝试测试 MQL4/DLL
交互而不通过任何 string
证明所有其他参数,按值传递并按引用寻址,确实如您所料到达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[]
,您 assemble 在 [=15 中的一些序列化表示=] 并在另一端解析它,然后再处理预期的功能。
丑?
是的,可能看起来像那样,
但是
让你专注于核心功能并且让你远离任何下一个范式转变如果不仅strings
不再是strings
等
问题是因为在 MQL4 中,long
是 8 个字节,而 C++ 中的 long
是 4 个字节。
- 您需要的是 C++ 构造函数中的
long long
。 - 或者您也可以将它们作为字符串传递,然后在您的 C++ 代码中将它们转换为适当的类型。