MT5使用DLL中的类(补充)

文章讲述了在尝试在MT5环境中直接使用DLL库中的类创建对象和调用成员函数时遇到的编译错误。作者尝试了多种方法,包括声明类、引用类、创建对象的函数接口等,最后通过在类前添加__declspec(dllexport)宏和使用单独的函数调用来成功解决。解决方案是定义一个包含类方法的DLLAPI函数,并在MT5中仅引用这个函数。
摘要由CSDN通过智能技术生成

之前写过一篇文章介绍了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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值