讨论 "如何在10分钟内为MQL5编写一个DLL并交换数据"。 - 页 10

 

这就是问题所在,脚本只是踢出,我怎么能看到之后的错误代码?或者下次运行的时候,能不能立即读取?

原则上,通过 为64x编译dll 来解决这个问题。虽然之后我得到了更多的错误,但这并不重要。 我只是需要了解如何建立和链接c/s++的库到mql5的一般情况。我的例子现在运行良好。

 
是否会有文章的更新?dll的运作是否有任何变化?
 

如果你有Studio 2017,而你在看这些旧工作室的说明时,不知道要做什么或怎么做,我建议你先阅读这篇文章:https://docs.microsoft.com/ru-ru/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=vs-2017

然后,当你按照本文的例子创建了你的dll,并在客户端应用程序上进行了测试,请阅读这个指令,从第2点开始,"在MQL5程序中,它应该被这样描述和调用:"。换句话说,在mt5中按照那里的描述声明你的dll。

我已经这样解决了我的问题。

 

我想要一个以宏的形式列出的C++和MQL之间的类型关联性。

#define  MQL_STRING wchar_t
 
@Renat Fatkhullin,我需要一个关于如何在DLL中调整数组和字符串大小的例子。应该通过realloc()来完成,还是可以不释放传递的数据,而只是把指针改成一个新的数据数组?
 

下面是我在Visual Studio 2012 C++中的代码。文件main.以cpp为扩展名(main.cpp)。

#define  MT4_EXPFUNC __declspec(dllexport) создал макрос чтобы не писать запись __declspec(dllexport)int __stdcall add(int a=0, int b=0)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)и так пробовал тоже
MT4_EXPFUNC int __cdecl add(int a=0, int b=0)//stdcall данная примитивная функция ничего не делает а просто возвращает значение 18
{return (18);пробовал так return 18;}

然后我创建了一个主扩展名为def的文件(main.def),其中有一个导出的函数列表,代码看起来像这样。

LIBRARY "dllmt42"
EXPORTS
add

然后我把它导入编译器

#import "dllmt42.dll"
int _add(int a=0, int b=0);
#import

编译后没有问题,但当你把EA留在图表上时,我就感到困惑了

未解决的导入函数调用,在'dllmt42.dll'中找到'_add'。拖动文件时,Total Comander会看到该函数以及编译器本身

谁能帮助如何解决这个错误的问题,毕竟有一个扩展名为.def的文件,它存储并负责正确导出函数?


 
Seric29:

以下是我在Visual Studio 2012 c++中的代码。文件main.以cpp为扩展名(main.cpp)。

然后我创建了一个主扩展名为def的文件(main.def),其中有一个导出的函数列表,代码看起来像这样。

然后我把它导入编译器

编译后没有问题,但当你把EA留在图表上时,我就感到困惑了

未解决的导入函数调用,在'dllmt42.dll'中找到'_add'。拖动文件时,Total Comander会看到该函数以及编译器本身

谁能帮助,如何解决错误的问题,毕竟有一个扩展名为.def的文件,它存储并负责正确导出函数?


在导出函数的声明和实现中都应该加上extern "C",因为这是C++。否则,输入的签名就是 "加号",MT(以及其他所有人)将看不到它们。

 
Maxim Kuznetsov:

在导出函数的声明和实现中都必须添加extern "C",因为C++在这里。否则,输入的签名是 "加号",MT(像其他人一样)不会看到它们。

我以这种方式添加了它

#define  MT4_EXPFUNC extern "C" __declspec(dllexport)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)
MT4_EXPFUNC int __cdecl add(int a=0, int b=0)//stdcall
{
    return (18);
}

但还是同样的问题--未解决的导入函数调用,在'dllmt42.dll'中找到'_add'...也就是说,我需要没有++的纯C?

 
根本不需要.def文件。你需要在MQL的#import部分重复这些函数
 
Roffild:
根本不需要.def文件。你需要在MQL的#import部分重复这些函数

好吧,是的,没有它我就看到了之类的,我不去,好吧,给我看看它是什么复制的,已经指出的方式?