首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建一个DLL,它接受来自MT4的字符串并返回回字符串类型?

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

Stack Overflow用户
提问于 2016-12-10 10:25:23
回答 3查看 1.1K关注 0票数 1

我尝试了两个星期来创建一个DLL,我可以传递字符串和获得返回字符串。但还是没有成功。

我在Dev++(TDM-GCC 4.9.2)和2015年可视化演播室社区上尝试了这一点。我对此进行了大量的搜索,并尝试了我找到的几乎每一个示例代码,但都没有成功。

我必须使用这个DLL与MetaTrader终端4

下面是我使用的一个示例代码。这段代码编译成功,但是当我从string 向它发送一个时,我会得到一个访问冲突错误。

代码语言:javascript
运行
复制
#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");
}
EN

回答 3

Stack Overflow用户

发布于 2016-12-10 10:42:05

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

如果您想确保不同的工具链都能正常工作,请坚持使用以空结尾的C字符串。

票数 2
EN

Stack Overflow用户

发布于 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 );,您的努力将带来干净的代码、更好的第三方语言包装器之间的可移植性,并将进一步减少维护成本。

票数 1
EN

Stack Overflow用户

发布于 2016-12-10 10:57:01

很可能,您的代码和您要链接的代码是用不同的ABI为std::string编译的,即库使用的字符串具有与您正在编译的字符串不同的内存布局(和sizeof)。

我曾经遇到这个问题时,链接到hdf5库和使用gcc。在这种情况下,问题可以通过恢复到以前的ABI来解决,正如这里所解释的那样。

然而,当没有这样的解决方案时,clang也出现了这个问题。因此,为了使这一切正常工作,我必须避免在使用不同的ABI编译的任何对库的调用(在我的例子中是std::string )中使用std::string,而是使用const char*来处理hdf5接口。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41074470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档