C++的左膀右臂之动态链接库dll实例讲解

本篇文章主要讲解并且实例演示C++中的重要知识点—动态链接库dll

一.动态链接库(dll)简介

1.定义
动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL)是实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll"、".ocx"(包含ActiveX控制的库)或者 “.drv”(旧式的系统驱动程序)。

动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 文件中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。

2.作用
1).使用动态链接库可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。
2).动态链接库文件,是一种不可执行的二进制程序文件,它允许程序共享执行特殊任务所必需的代码和其他资源。
3).程序可根据 DLL 文件中的指令打开、启用、查询、禁用和关闭驱动程序。

3.优缺点
优点:
1).扩展了应用程序的特性;
2).可以用许多种编程语言来编写;
3).简化了软件项目的管理;
4).有助于节省内存;
5).有助于资源共享;
6).有助于应用程序的本地化;
7).有助于解决平台差异;
8).可以用于一些特殊的目的。Windows 使得某些特性只能为 DLL 所用。

缺点:
1).当某个程序使用其它DLL中的函数时,就会创建依赖项。因此,该程序就不再是独立的,并且如果该依赖项被损坏,该程序就可能遇到问题,且程序可能无法成功运行
2).当一个程序有非常多的dll文件时,对于这些文件的管理是个相当麻烦的过程,如果程序在运行时缺少了dll文件,那么运行将失败。

二.实例演示创建dll文件及调用dll文件

动态链接库的概念讲了那么多肯定会很难理解,现在用一个例子来演示,大家就会明白了。
1.新建一个空的动态链接库工程。
点击文件,选择新建,点击项目。
在这里插入图片描述
在弹出的对话框中选择Visual C++,在下拉列表中选择Win32,点击Win32 控制台应用程序,设置名称为Testdll,点击确定。

在这里插入图片描述
在弹出的向导对话框中点击下一步。
在这里插入图片描述
在弹出的应用程序设置对话框中勾选DLL和空项目,点击完成。

在这里插入图片描述
弹出如下界面则创建成功
在这里插入图片描述
2.向动态链接库添加类。
右键点击Testdll项目,选择添加,点击新项目
在这里插入图片描述
在弹出的对话框中选择C++文件,名称设置为Test01,点击添加。
在这里插入图片描述
同理,添加头文件,名称也为Test01,点击添加。
在这里插入图片描述
生成的界面如下。
在这里插入图片描述
Testdll项目下
在Test01.h中编写程序:

#ifndef TEST01_H
#define TEST01_H

#ifdef DLL_EXPORT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)

#endif
extern "C" DLL_API int add(int i,int j);
class DLL_API print{
public:
	int printx(int x);
};

#endif

Test01.cpp中编写程序:

#include<stdio.h>
#include<iostream>
using namespace std;

#define DLL_EXPORT
#include "Test01.h"

DLL_API int add(int i,int j){
	return i+j;
	
}

DLL_API int print::printx(int x){
	return x;
}

配置
右键项目选择属性。
在这里插入图片描述
在弹出的对话框中进行以下配置。
在这里插入图片描述
点击确定后,选择生成,点击生成Testdll。
在这里插入图片描述
打开本地工程目录,有以下几项。
在这里插入图片描述
双击Debug文件夹,出现以下文件
在这里插入图片描述
双击Testdll文件夹,会有Test01.h文件。
在这里插入图片描述

将Testdll.dll文件和Test01.h文件拷贝到需要的工程目录下(正常创建一个项目,创建cpp和h文件),比如我拷贝到的是另一个项目Test01文件夹下。

在这里插入图片描述
在需要的项目中建一个文件夹用来存放上面的Testdll.lib文件(我的项目是Test01)。
在这里插入图片描述

打开另一个项目Test01,右键项目选择属性。

在这里插入图片描述
配置lib路径,在弹出来的对话框中选择VC++ 目录,选择右边的库目录,点击选择刚刚创建的lib文件夹。
在这里插入图片描述
接着点击链接器,选择输入,点击右边的附加依赖项。
在这里插入图片描述
添加Testdll.lib。
在这里插入图片描述
测试项目的程序编写
Test01项目
Test1.cpp

#include<stdio.h>
#include<iostream>
using namespace std;
#include"Test01.h"
#include"Test1.h"

void main(){
	cout<<add(1,2)<<endl;
	print p;
	cout<<p.printx(1)<<endl;
	system("pause");
}

经过调试,结果为:
在这里插入图片描述
以上是调用了动态链接库dll中类中的函数和普通函数。
额外补充一下,动态链接库中的构造函数也可以被调用,修改如下:
Testdll项目
Test01.cpp

#include<stdio.h>
#include<iostream>
using namespace std;

#define DLL_EXPORT
#include "Test01.h"

DLL_API int add(int i,int j){
	return i+j;
	
}

 DLL_API print::print(int x){
	cout<<x<<endl;
}

Test01.h

#ifndef TEST01_H
#define TEST01_H

#ifdef DLL_EXPORT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)

#endif
extern "C" DLL_API int add(int i,int j);
class DLL_API print{
public:
	 print(int x);
};

#endif

Test01项目
Test1.cpp

#include<stdio.h>
#include<iostream>
using namespace std;
#include"Test01.h"
#include"Test1.h"

void main(){
	cout<<add(1,2)<<endl;
	print p(2);
	
	system("pause");
}

结果:

在这里插入图片描述

发现可以运行,大家会发现,我的测试项目中并没有用到h文件,因为我是用了动态链接库,本项目可以调用动态链接库中的函数,而不需要在本项目中定义函数,具有模块分离的好处,在维护时只要修改dll文件,而不需要把整个程序都重新编译一遍,便于维护。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值