VS2019封装C++接口至可执行动态链接库.dll

VS2019封装C++接口至可执行动态链接库.dll

本文主要总结如何对已实现的C++函数、类进行封装,以便在其他平台或者语言上进行便捷使用或者二次开发!


重点参考:
1.https://blog.csdn.net/hai_fellow_Z/article/details/117290517
2.https://blog.csdn.net/weixin_38994901/article/details/106625837


备注:在进行编码是,务必将封装目录下的pch.h置于排列第一的头文件,如下图:

在这里插入图片描述

一.将函数封装成.dll+.lib具体实现步骤

  • 新建DLL工程:
    在这里插入图片描述
  • 填充pch.h和pch.cpp文件
    首先,在pch.h文件中,利用extern "C" __declspec(dllexport) void test();语句对要生成Dll的函数Test进行声明。
// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。

#ifndef PCH_H
#define PCH_H

// 添加要在此处预编译的标头
#include "framework.h"
#include <iostream>
extern "C" __declspec(dllexport) void test();

#endif //PCH_H
// pch.cpp: 与预编译标头对应的源文件

#include "pch.h"

// 当使用预编译的头时,需要使用此源文件,编译才能成功。
void test()
{
	std::cout << "yes! " << std::endl;
}
  • 点击工程上方生成解决方案,工程目录下x64文件夹下将生成对应的.dll.lib

在这里插入图片描述

  • 主函数调用:
    分别将封装好的路径放在./include文件夹下,和./lib文件夹下,正常配置其路径到VS属性下的外部包含目录、包含库目录,以及将.lib对应名字添加至链接器
//修改后的代码
#pragma once
#pragma comment(lib,"Dll1.lib")

#include <iostream>
using namespace std;
extern "C" __declspec(dllimport) void test();

int main()
{
	test();
	return 0;
}

二.将类封装成.dll+.lib具体实现步骤

  1. 创建DLL项目命名为BPNet
    在这里插入图片描述
    在这里插入图片描述
    项目自动生成了pch.cpp,pch.h,dllmain.cpp,framework.h四个文件,这个先不管它,也不要删除。
  2. 写好主要内容,想封装的不想让别人看见的。本文是BP.cpp和BP.h,BP.cpp主类为 class TEST,嵌套类为class BPNET,主要结构如下:
    BP.h内容:
/*BP.h*/
class TEST
{
public:
	class BPNET {//嵌套类
	public:
		BPNET();
		~BPNET();
	}m_bpnet;//内嵌类名字
public:
	TEST();
	~TEST();
	void split();
	void mytrain();
	void mytest();
};
/*BP.cpp*/
TEST::BPNET::BPNET(){}
TEST::BPNET::~BPNET(){}
TEST::TEST(){}
TEST::~TEST(){}
void TEST::split()//不想让用户看见这个函数
{
}
void TEST::mytrain()
{
}
void TEST::mytest()
{
}
  1. 基类
    因为我们封装dll是不想让用户看见我们的源码细节,只需要提供个接口给他们调用,所以我们建个虚基类,基类中的函数就是函数调用的接口。
    我将基类写在pch.h文件中,不用写函数的实现,只写声明就可以了。
/*pch.h*/
class BPBase
{
public:
	BPBase() {};
	virtual ~BPBase() {};
public:
//只开放这两个函数接口
	virtual void mytrain() = 0;
	virtual void mytest() = 0;
};

再修改BP.h文件,让TEST类继承BPBase类
在这里插入图片描述

  1. 工厂类
    因为基类是虚类,不能创建实例,所以用基类的指针指向子类,调用子类的功能。创建BPFactory.cpp和BPFactory.h,联系基类和子类。
/*BPFactory.h*/
#pragma once
#include"pch.h"
class CLASS_DECLSPEC BPFactory
{
public:
	BPFactory();
	~BPFactory();
public:
	BPBase* CreateObject();
	void DeleteObject(BPBase* _bp);
};

/*BPFactory.cpp*/
#include "pch.h"
#include"BPFactory.h"
#include "BP.h"
// 当使用预编译的头时,需要使用此源文件,编译才能成功。

BPFactory::BPFactory()
{}
BPFactory::~BPFactory()
{}

BPBase* BPFactory::CreateObject()
{
	return new TEST;
}
void BPFactory::DeleteObject(BPBase* _bp)
{
	if (_bp)
		delete _bp;
}
  1. 导出类和函数,在基类所在头文件中加上这一句
    #define CLASS_DECLSPEC __declspec(dllexport)//表示这里要把类导出再修改基类声明,所有类都要加上CLASS_DECLSPEC
    在这里插入图片描述
    文档细节
/*pch.h*/
#ifndef PCH_H
#define PCH_H
// 添加要在此处预编译的标头
#include "framework.h"
#endif //PCH_H

#define CLASS_DECLSPEC __declspec(dllexport)//表示这里要把类导出//
//基类
class CLASS_DECLSPEC BPBase
{
public:
	BPBase() {};
	virtual ~BPBase() {};
public:
	virtual void mytrain() = 0;
	virtual void mytest() = 0;

};
  1. DLL调用
    重新创建一个项目hello,将原来DLL项目的dll和lib还有基类头文件pch.h和工厂类BPFactory.h,共四个文档复制到新项目里,如下图红圈标注的四个文件

    在这里插入图片描述

新项目的main.cpp

#include<iostream>
#include"BPFactory.h"//工厂类调用
using namespace std;
int main()
{
	BPFactory factory;
	BPBase* bpDll = factory.CreateObject();
	bpDll->mytrain();
	bpDll->mytest();
}

添加依赖后运行:
在这里插入图片描述
8.运行结果:
在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
动态DLL)是在Windows操作系统中广泛使用的一种可执行文件格式,它包含了可重用的代码和数据,可以被多个程序共享和调用。通过将一些常用功能封装DLL中,可以简化程序开发和维护工作,提高代码的复用性。 在Visual C++中进行DLL编程可以通过使用动态项目模板来创建和开发。首先,我们需要定义并导出需要在DLL中使用的函数和数据。在函数定义前加上__declspec(dllexport)修饰符可以将其导出为DLL中的可用接口。导出的函数可以在其他程序中使用,来实现相关功能。 其次,必须在DLL项目的配置属性中指定相应的选项。需要设置输出类型为动态,同时选择合适的平台和工具集。可以指定DLL的输出文件名和路径,以及其他编译和链选项。 在DLL编程中,可以使用静态链动态的方式进行函数调用。在静态链中,函数在编译时被复制到程序中,因此程序的大小会增加。而在动态中,调用函数时会在运行时从DLL中加载,并且可以在系统中共享,减小了程序的体积。 DLL编程还常用于插件开发。插件是一种独立的功能模块,可以在程序运行时通过加载DLL来扩展功能。这样,程序的功能可以灵活地进行扩展和更新,提高了可定制性和可维护性。 总结来说,深入浅出Visual C++ DLL编程是通过使用动态项目模板在Windows操作系统中创建和开发可重用的代码和数据。使用DLL可以简化程序开发和维护工作,提高代码复用性。通过在DLL中定义和导出函数和数据,可以在其他程序中使用来实现相关功能。DLL编程适用于静态链动态方式进行函数调用,常用于插件开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月醉窗台

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值