之前写过一篇文章介绍了MT5如何使用vs2019创建的DLL库中的函数。这篇文章主要是对使用DLL中的类的一点补充。
问题:
我在DLL中新建一个类,试图在MT5中直接使用这个类(例如创建对象,调用成员函数),但是多次尝试后均失败告终。
尝试过程:
1、通过__declspec(dllexport)声明类名,直接在MT5中尝试用该类创建对象并调用成员函数,编译时报错,使用没有定义的类型。(卧槽-有猫腻!)
2、和引用函数类似引用类:
#import "MT5API.dll"
int Add(const int a, const int b);
int Sub(const int a, const int b);
int Mul(const int a, const int b);
int Div(const int a, const int b);
int testCurl();
bool testMail();
int testAdd();
#import
//按照如下形式引用类
#import "MT5API.dll"
class Test;
#import
编译报错,import未关闭,同时依然不识别Test这个类。(TMD怎么还不行!)
3、单独创建函数来处理Test类的生成和释放:
class Test
{
public:
void DoSomething();
};
// 函数接口
extern "C" __declspec(dllexport) Test* CreateTest();
extern "C" __declspec(dllexport) void DestroyTest(Test* test);
extern "C" __declspec(dllexport) void Test_DoSomething(Test* test);
然而编译时依然不识别Test类型。(怀疑人生!!!)
4、单独写一个函数,在函数内部创建Test类的对象并调用成员函数。(鲜花!!!鼓掌!)
#define _DLLAPI extern "C" __declspec(dllexport)
//声明
_DLLAPI int __stdcall testAdd();
//实现
int testAdd()
{
MyMath* test = new MyMath;
int a = 10, b = 20;
return test->add(a, b);
}
最终解决方案:
宏定义:
#define _DLLAPI extern "C" __declspec(dllexport)
MyMath类:
class __declspec(dllexport) MyMath {
public:
int add(const int a, const int b);
int sub(const int a, const int b);
};
单独定义的函数:
_DLLAPI int __stdcall testAdd();
int testAdd()
{
MyMath* test = new MyMath;
int a = 10, b = 20;
return test->add(a, b);
}
在MT中引用该DLL,只需要包含testAdd函数即可:
#import "MT5API.dll"
int testAdd();
#import