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

news2024/11/25 10:35:48

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和lib文档
    选择debug或release,两个都可以生成dll和lib,选择哪个就可以去项目下的哪个文件下找dll和lib,具体区别可以自己查,X86和X64都可以选择,最后点击调试,就可以了。

在这里插入图片描述

  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.运行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打工人的发展困境

近期在公司内部QE社区举办了一场研讨会&#xff0c;主题是《QA角色职业发展机遇讨论》。收集到以下观点&#xff0c;觉得挺有意思&#xff0c;又不局限于特定角色&#xff0c;于是用XX代替QA。 无论是在公司内部还是外部&#xff0c;XX都是单独作战居多&#xff0c;从他人身上…

都在说00后是躺平的一代,公司刚来的00后却把我卷哭了

上个月公司来了许多新面孔&#xff0c;其中居然有一个是00年的&#xff0c;虽然也给公司带来了一些新的血液&#xff0c;但也让我意识到&#xff0c;自己年级确实不小了。这小老弟是去年毕业的&#xff0c;在某软件公司干了半年&#xff0c;现在跳槽到我们公司起薪18K&#xff…

通过数据分析提升客流量和销售额

只有把每一位来光临的顾客都当作最后一位顾客&#xff0c;我们才可能真正实现营销和服务管理的精细化&#xff0c;正如只有把自己的每一天都当作生命的最后一天来对待的人才可能真正珍惜时间和生命一样。 如何提高门店的销售额可以说是大部分店长都十分困惑的问题&#xff0c;…

12月13日 OpenCV 实战基础学习笔记——Harris、SIFT

文章目录前言一、Harris 角点检测1、公式推导2、找到 E(u,v)E(u, v)E(u,v) 的最大值二、SIFT1、关键点定位 keypoint localisation2、特征描述 feature description前言 本文为12月13日 OpenCV 实战基础学习笔记&#xff0c;分为两个章节&#xff1a; Harri 角点检测&#xf…

docker安装Gitlab、修改密码、创建组、创建项目、创建用户、Git拉取代码

安装 建议内存大于2G 开放防火墙端口80和配置映射文件夹 firewall-cmd --zonepublic --add-port80/tcp --permanent firewall-cmd --reload mkdir -p /docker_data/gitlab/{data,logs,config}启动Gitlab容器&#xff08;启动容器之前确保22&#xff0c;80&#xff0c;443端口没…

图解外包验收流程V2.0及详细说明实例

详细说明 01、【开发计划内容】-标准模板{文档} 1.包含二级模块开发计划&#xff0c;标注里程碑验收节点&#xff1b; 2.包含架构设计、数据库设计输出时间&#xff1b; 3.包含接口开发计划及其接口明细&#xff1b; 4.所有节点分配到具体的人和具体的开始结束时间&#xff1…

Python读取Word文档中的Excel嵌入文件

今天群友提出一个问题&#xff1a; 给出Word示例如下&#xff1a; 对于这种嵌入文件在Word中都属于ole文件。 下面我们假设需要读取每个嵌入的Excel文件中的python工作表中的A1单元格。 python调用宏实现 首先我们看看如何调用com接口的宏代码实现这个效果&#xff0c;最终完…

SpringBoot多模块项目初始化搭建

&#x1f3b6; 文章简介&#xff1a;SpringBoot多模块项目初始化搭建 &#x1f4a1; 创作目的&#xff1a;详细介绍SpringBoot多模块项目的搭建 ☀️ 今日天气&#xff1a;阳光明媚 &#x1f4dd; 每日一言&#xff1a;不求事事圆满&#xff0c;但求事事甘心。 文章目录1、新建…

数据结构与算法——Java实现单链表、双向链表、环型链表、约瑟夫

目录 一、单链表 1.1 单链表基本介绍 1.2 分析与实现带head头结点的单向链表 1.2.1第一种方式&#xff1a; 尾部添加元素示意图 1.2.2 尾部添加元素的代码实现以及遍历链表的实现 1.2.3 第二种方式&#xff1a; 根据排名将节点插入到指定位置的示意图 1.2.4 根据排名将节…

MySQL入门到精通经典50题,看这一篇就够了

MySQL入门到精通经典50题学习笔记 pdf获取方式&#xff0c;公众号&#xff1a;每天都要努力coding回复&#xff1a;mysql经典50题 文章目录MySQL入门到精通经典50题学习笔记[toc]MySQL安装教程详解数据预览sql建表语句1.查询" 01 “课程比” 02 "课程成绩高的学生的…

基于鸽群算法优化的lssvm回归预测-附代码

基于鸽群算法优化的lssvm回归预测 - 附代码 文章目录基于鸽群算法优化的lssvm回归预测 - 附代码1.数据集2.lssvm模型3.基于鸽群算法优化的LSSVM4.测试结果5.Matlab代码摘要&#xff1a;为了提高最小二乘支持向量机&#xff08;lssvm&#xff09;的回归预测准确率&#xff0c;对…

你的项目需要自动化测试吗?看看这篇文章再说吧

什么是自动化测试&#xff1f; 通过代码的方式&#xff0c;实现测试用例的自动运行&#xff0c;评估运行结果&#xff0c;并对测试结果及异常情况进行记录。 为什么进行自动化测试&#xff1f; 纯手工测试会有好多重复性的操作&#xff0c;浪费时间&#xff0c;而且频繁的回…

央企招聘:中国大唐集团2023年度公开招聘公告

中国大唐集团科学技术研究总院有限公司&#xff08;以下简称科研总院&#xff09;是世界500强企业——中国大唐集团有限公司&#xff08;以下简称集团公司&#xff09;的全资子公司&#xff0c;是集团公司的科技创新中心、战略参谋本部、成果孵化中心、技术服务保障基地和科技人…

Qt+VS+VTK综合开发环境配置

说明 本文旨在介绍一种个人常用的开发环境&#xff0c;主要解决在VS中开发Qt项目的部分问题&#xff0c;以及解决使用基于Qt的VTK库开发时可能遇到的部分问题&#xff0c;并通过合理的配置提升新项目搭建时间 该教程使用版本为VS2017&#xff0c;Qt5.14.2以及VTK8.2&#xff…

git_No.1_版本管控的全流程

文章目录1.获取Git仓库1.1 已存在目录中初始化仓库1.2 克隆一个仓库2. 将变更提交到仓库2.1 查看当前文件状态2.2 跟踪新文件2.3 暂存已修改的文件2.4 忽略文件2.5 查看已暂存和未暂存的修改2.6 提交更新2.7 跳过使用暂存区2.8 移除文件3. 查看提交历史4.远程仓库4.1 查看远程仓…

HTTP介绍

目录 1.什么是HTTP&#xff1f; 2.HTTP的特点 3.HTTP的优点和缺点 4.HTTP请求数据格式 5.HTTP响应数据格式 6.GET请求和POST请求的区别 7.状态码分类说明 8.查看发送的请求数据包方式 1.什么是HTTP&#xff1f; Hyper Text Transfer Protocol,超文本传输协议&#xff…

[036]基于Vue+Nodejs的网上作业批改系统(含源码、数据库、万字课设报告)

文章目录一、项目介绍二、源码获取一、项目介绍 网络作业提交与批改系统&#xff1a;超强的作业批改项目&#xff0c;技术栈是VueNodeMysql&#xff0c;最重要的是有超详细的万字报告&#xff0c;一劳永逸&#xff0c;可冲~ 主要功能介绍&#xff1a; 1.管理员功能模块 管理员…

分享几个宝藏微信小程序

1.有数鸟&#xff1a;了解会员在各平台的消费明细 平时我们看视频听音乐&#xff0c;我们用的很多vip&#xff0c;你还记得你注册了哪些应用吗&#xff1f;有了这个小程序&#xff0c;就可以帮你记录每个平台的付款详情&#xff0c;以及总支出。 当我们添加会员项目时&#xff…

基于java+springboot+mybatis+vue+mysql的乒乓球预约管理系统

项目介绍 随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;乒乓球馆预约管理系统 也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变…

基于C+++FLTK实现(WinForm)超市收银系统【100010032】

超市收银系统 Supermarket POS system 本次大作业是利用 C语言&#xff0c;基于 FLTK 图形库来设计超市收银系统。首先介绍程序的设计思想&#xff1a; 这套程序完全是基于题目所给的要求逐条逐步设计的。我把程序实现大致分为数据层面和图形层面。 数据层面&#xff1a; 程…