首页 > 其他分享 >DLL 动态链接库的创建与使用

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

时间:2024-08-08 12:50:50浏览次数:5  
标签:函数 int 创建 DLLdemo dll 动态链接库 DLL TestDLL

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,无法继续执行代码。重新安装程序可能会解决此问题。

标签:函数,int,创建,DLLdemo,dll,动态链接库,DLL,TestDLL
From: https://www.cnblogs.com/windandchimes/p/18348703

相关文章

  • 【Dash】使用 dash_mantine_components 创建图表
    一、StylingYourAppTheexamplesintheprevioussectionusedDashHTMLComponentstobuildasimpleapplayout,butyoucanstyleyourapptolookmoreprofessional.Thissectionwillgiveabriefoverviewofthemultipletoolsthatyoucanusetoenhanc......
  • 使用 createError 创建错误对象的详细指南
    title:使用createError创建错误对象的详细指南date:2024/8/8updated:2024/8/8author:cmdragonexcerpt:摘要:本文介绍了createError函数在Nuxt应用开发中的使用方法,用于创建带有附加元数据的错误对象,以提升错误处理的灵活性和用户体验。内容包括函数参数说明、......
  • 使用 createError 创建错误对象的详细指南
    title:使用createError创建错误对象的详细指南date:2024/8/8updated:2024/8/8author:cmdragonexcerpt:摘要:本文介绍了createError函数在Nuxt应用开发中的使用方法,用于创建带有附加元数据的错误对象,以提升错误处理的灵活性和用户体验。内容包括函数参数说明、在Vue组......
  • 基于STM32F103的FreeRTOS系列(七)·任务创建·列表的使用超详细解析
    目录1. 列表和列表项1.1 列表和列表项简介1.1.1  列表1.1.2  列表项1.1.3  迷你列表项1.1.4 列表与列表项关系图1.2 列表初始化1.3 列表项的初始化1.4 列表项的插入函数1.5 列表项的末尾插入1.6 列表项的删除1.7 列表的遍历1. 列表......
  • astro中创建web components
    MyCounter.astro:<script>consttemplate=`<style>*{font-size:200%;}span{width:4rem;display:inline-block;text-align:center;}button{width:4rem;height:4rem;......
  • 如何创建一个简单的音乐推荐页面:从零开始的指南(内含完整代码)
    如何创建一个简单的音乐推荐页面:从零开始的指南引言在这篇博客中,我们将学习如何创建一个简单的音乐推荐页面。这个项目将帮助你熟悉HTML、CSS和JavaScript的基本使用。我们会创建一个现代化的页面,包括一个顶部导航栏、一个轮播图展示最新音乐、一个推荐歌曲列表以及一个基础......
  • astro中创建web components
    先创建AstroHeart.astro:<script>//DefinethebehaviourforournewtypeofHTMLelement.classAstroHeartextendsHTMLElement{constructor(){super();letcount=0;constheartButton=this.quer......
  • FreeRTOS中任务创建函数xTaskCreate()的解析
    目录函数xTaskCreate()函数prvInitialiseNewTask()函数pxPortInitialiseStack()函数prvAddNewTaskToReadyList()总结函数xTaskCreate()此函数用于使用动态的方式创建任务,任务的任务控制块以及任务的栈空间所需的内存,均由FreeRTOS从FreeRTOS管理的堆中分配,若使用此函数,......
  • Java并发编程——线程创建的4种常见方式
    文章目录一、继承Thread类创建创建线程类1.1Thread类解析1.2使用方法1.3优缺点二、实现Runable接口创建线程类2.1Runable接口解析2.2使用方法2.3优缺点三、使用Callable和FutureTask创建线程3.1Callable接口解析3.2RunnableFuture接口解析3.3Futu......
  • 解析rasterfileio.dll:图像处理核心组件与修复指南
    rasterfileio.dll是一个动态链接库(DynamicLinkLibrary,简称DLL)文件,通常与图像处理软件、GIS(地理信息系统)软件或CAD(计算机辅助设计)软件有关。特别是,它可能与ESRI公司的ArcGIS软件相关联,ArcGIS是一种广泛使用的GIS平台,用于地图创建、地理数据分析、地理信息系统管理和空间可视化......