我尝试了两个星期来创建一个DLL,我可以传递字符串和获得返回字符串。但还是没有成功。
我在Dev++(TDM-GCC 4.9.2)和2015年可视化演播室社区上尝试了这一点。我对此进行了大量的搜索,并尝试了我找到的几乎每一个示例代码,但都没有成功。
我必须使用这个DLL与MetaTrader终端4。
下面是我使用的一个示例代码。这段代码编译成功,但是当我从string 向它发送一个时,我会得到一个访问冲突错误。
#ifndef MYLIB_HPP
#define MYLIB_HPP
#include <string>
#ifdef MYLIB_EXPORTS
#define MYLIB_API __declspec(dllimport) 
#else
#define MYLIB_API __declspec(dllexport) 
#endif
bool MYLIB_API test(const std::string& str);
#endif
bool MYLIB_API MyTest(const std::string& str)
{
    return (str == "Hi There");
}发布于 2016-12-13 04:52:33
你刚刚经历了一个MQL4的把戏,
string不是string,而是string,因此MQL4端的#import将使MT4注入,不符合DLL C端的期望和访问违规错误是很简单的,因为C端代码试图访问MQL4区域.
设计API/DLL的第一条规则:仔细阅读文档。
是的,人们可能会反对,MQL4文档有点难以遵循,但是更多的是Rule#1,非常非常仔细地阅读文档,因为一些重要的设计事实几乎隐藏在一些不太可预测的章节中,或者隐藏在解释ENUM表、编译器指令、Rule#1旁注等中。
第二条规则:设计API/DLL接口,以便实现平滑的集成。
MQL4改变了有关构建670+的规则。好消息是,MetaQuotes已经宣布,他们一方将不再对MT4进行进一步的投资,因此DLL/API集成的MT4端有望停止进一步的渗透。
考虑到您设计DLL/API的声明,尝试设计未来的验证规范--使用uchar[]-s块而不是“解释”string,传递输入和输出by-reference,并且只返回某种形式的int aReturnCODE = myDLL_FUNC( byRefParA, byRefParB, byRefRESULT );,您的努力将带来干净的代码、更好的第三方语言包装器之间的可移植性,并将进一步减少维护成本。
https://stackoverflow.com/questions/41074470
复制相似问题