DLL 动态链接库的创建与使用

DLL 动态链接库的创建与使用

参考教程:

DLL动态链接库的创建与使用(实例教程) - ElaineTiger - 博客园 (cnblogs.com)

1. 什么是动态链接库

动态链接库是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。动态链接库文件名的扩展名一般是dll,也有可能是drvsysfon,它和可执行文件(exe)非常类似,区别在于动态链接库中虽然包含了可执行代码却不能单独执行,而应由应用程序直接或间接调用。

动态链接库是相对于静态链接而言的。

所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的可执行文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。

而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在操作系统的管理下,才在应用程序与相应的动态链接库之间建立链接关系。当要执行所调用动态链接库中的函数时,根据连接产生的重定位信息,操作系统才转去执行动态链接库中相应的函数代码。

动态链接库的使用。当要执行所调用动态链接库中的函数时,根据连接产生的重定位信息,操作系统才转去执行动态链接库中相应的函数代码。

在 VS 中创建动态链接库一般都会生成.lib文件和.dll文件,在应用程序项目里使用动态链接库要添加.lib文件,语令#pragma comment(lib,“xxx.lib”),这不是静态库的调用吗?其实这个文件记录了dll中函数的入口地址,所以要像静态库中的.lib文件一样,用同样的方式加到我们的项目里,添加好后直接运行会得到错误:由于找不到xxx.dll,无法执行代码。所以要添加.dll文件,一定要放在项目的.exe同一个路径下。

还有几个注意事项:

1、可以修改.lib文件的文件名,只要在项目引用它时是它目前的名称,但不能改变.dll的文件名,否则依旧会出现找不到.dll文件的错误。

2、.dll文件也要和应用程序的位数相对应,要么都是 64 位,要么都是 32 位,不可交叉使用,否则报错,应用程序无法正常启动。

2. 创建 DLL 项目

打开Visual Studio,选择“创建新项目(N)

搜索“动态链接库(DLL)”,选择“动态链接库(DLL)”,点击“下一步”:

设置项目名称“DLLdemo”,保存位置为”D:\

即可打开如下图所示的项目界面:

创建头文件TestDLL.h,它是作用是用来声明需要导出的函数接口,点击“头文件”,右键,选择“添加”,选择“新建项”。

选择“头文件”,输入名称“TestDLL.h”,点击“添加

TestDDLL.h中添加示例代码:

#pragma once
extern "C" _declspec(dllexport) int Add(int a, int b);

  • extern “C”:作用是告诉编译器代码按C语言的方式进行编译
  • _declspec(dllexport):此修饰符告诉编译器和链接器被它修饰的函数或变量需要从 DLL 导出。与其相对的代码是_declspec(dllimport) 此修饰符告诉编译器和链接器被它修饰的函数或变量需要从 DLL 导入。
  • int Add(int a, int b):需要被其他程序调用的函数

创建源文件TestDLL.cpp,它的作用是用来实现被声明的函数。

点击“源文件”,右键,选择“添加”,选择“新建项

选择“C++文件(.cpp)”,修改名称为TestDLL.cpp,点击”添加

TestDDLL.cpp中添加示例代码:

#include "pch.h"

#include "TestDLL.h"

int Add(int a, int b) {
	return a + b;
}

3. 编译

点击”解决方案‘DLLdemo’,右键,选择“生成解决方案(B)

会在该项目路径...\DLLdemo\x64\Debug下生成一个DLLdemo.dll文件

4. 调用动态链接库

打开Visual Studio,选择“创建新项目(N)

选择“控制台应用”,并点击“下一步

输入项目名称为TestDLL,并将其安装在D盘。

D:\DLLdemo\x64\DebugDLLdemo.dllDLLdemo.lib文件放到D:\TestDLL\TestDLL文件夹下

D:\DLLdemo\DLLdemo文件夹下的TestDLL.h文件放到D:\TestDLL\TestDLL文件夹下

编写TestMain.cpp,将TestMain.cpp修改为如下内容:

#include "TestDLL.h"

#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "Dlldemo.lib")

int main() {
	int c = Add(5, 3);
	printf("5+3=%d", c);
	system("pause");
	return 0;
}

点击“本地Windows 调试器

测试结果如下图所示:

D:\DLLdemo\x64\DebugDLLdemo.dll复制粘贴到 D:\TestDLL\x64\Debug 文件夹下

双击 TestDLL.exe

即可看到如下图所示的结果

  • 测试:没有将DLLdemo.dll复制粘贴到 D:\TestDLL\x64\Debug 文件夹下

    如果我们没有将DLLdemo.dll复制粘贴到 D:\TestDLL\x64\Debug 文件夹下

    则双击 TestDLL.exe,会显示“由于找不到DLLdemo.dll,无法继续执行代码。重新安装程序可能会解决此问题。

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值