如何创建一个DLL,它接受来自MT4的字符串并返回字符串类型?

时间:2016-12-10 10:25:23

标签: c++ dll mql4 metatrader4 mt4

我正在尝试两周来创建一个DLL,我可以传递字符串并返回字符串。但仍然没有成功。

我在Dev-C ++(TDM-GCC 4.9.2)和视觉工作室社区2015上尝试了这个。我搜索了很多关于这一点,并尝试了几乎我发现的每个示例代码,但我没有成功。

我必须在 MetaTrader Terminal 4 中使用此DLL 这是我使用的一个示例代码。此代码已成功编译,但当我向 string 发送来自MT4 时,我收到了访问冲突错误。

#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");
}

3 个答案:

答案 0 :(得分:2)

如果你在DLL和另一个可执行文件之间共享一个C ++ string,那么两者都需要使用相同的工具链进行编译。这是因为std::string仅在标头中定义。因此,如果DLL和可执行文件使用不同的string标头,则它们可能是二进制不兼容的。

如果你想确保事情适用于不同的工具链,请坚持使用NULL终止的C字符串。

答案 1 :(得分:1)

  

您刚刚体验过MQL4技巧之一,MQL4 string 不是string ,而是struct < / strong>因此,MQL4端的 #import 将使MT4注入,不符合您的DLL C端预期,并且访问冲突错误很简单,因为您的C端代码尝试过访问MQL4地区......

设计API / DLL的第一条规则:仔细阅读文档。

是的,有人可能会反对,MQL4文档有点难以理解,但因此规则#1的两倍,非常,非常,非常仔细地阅读文档,因为一些重要的设计事实几乎隐藏在一些不太常见的可预测的章节或ENUM表,编译器指令, pragma -s side-notes et al。

的解释中的某处

第二条规则:设计API / DLL接口以便顺利集成

MQL4改变了有关Build 670+的规则。好消息是,MetaQuotes宣布,他们不会进一步投资MT4进一步开发,因此DLL / API集成的MT4端有望停止进一步爬行。

鉴于您的陈述,您设计DLL / API,尝试设计面向未来的规范 - 使用 uchar[] -s的块而不是“解释”-sensitive string ,传递输入和输出按参考并返回某种形式的 int aReturnCODE = myDLL_FUNC( byRefParA, byRefParB, byRefRESULT ); ,您的努力将导致清洁代码,第三方语言包装器之间更好的可移植性,并且还可以最大限度地降低您的进一步维护成本。

答案 2 :(得分:0)

最有可能的是,您的代码和您链接的代码已使用std::string的不同ABI进行编译,即库使用的字符串具有不同的内存布局({{1} })而不是你正在编译的那个。

我在连接hdf5库并使用gcc时遇到过这个问题。在这种情况下,问题可以通过恢复到先前的ABI来解决,如here所述。

然而,当没有这样的解决方案时,clang也会出现问题。因此,为了使这一切正常工作,我必须避免在使用不同的ABI编译的库(我的情况下为hdf5)的任何调用中使用sizeof,而是使用{{1}来使用hdf5接口。 }。