第九讲 动态链接库

合集下载

动态链接库的使用方法

动态链接库的使用方法

动态链接库的使用方法动态链接库(Dynamic Link Library,DLL)是Windows系统中一种常见的文件类型,用于存储可被程序在运行时动态加载的函数和数据。

它可以提供代码和资源的共享,使得程序的安装包更小,节省了系统资源。

使用动态链接库有以下几个优点:1.模块化:将程序代码和资源划分为独立的模块,便于开发和维护。

2.共享性:多个程序可以共享同一个动态链接库,减少重复的代码和数据的存储。

3.动态加载:可以在程序运行时动态地加载和卸载动态链接库,提高了程序的灵活性和可扩展性。

1.创建动态链接库:使用C/C++编程语言可以创建动态链接库。

首先,在开发环境中创建新的DLL项目,并选择动态链接库的类型。

在项目中添加需要的代码和资源,并编写相应的函数和数据接口。

将这些接口封装在一个头文件中,并在源文件中实现具体的功能。

最后,编译项目生成动态链接库文件(.dll 文件)。

2.导出函数和数据:在动态链接库中,明确指定哪些函数和数据需要被其他程序调用。

在函数和数据的声明前加上__declspec(dllexport)关键字即可。

例如:```C++__declspec(dllexport) int Add(int a, int b);```3.调用动态链接库:在其他程序中调用动态链接库中的函数和数据,需要先导入相应的函数和数据。

使用C/C++编程语言可以创建一个头文件,其中包含要导入的函数和数据的声明。

例如:```C++__declspec(dllimport) int Add(int a, int b);__declspec(dllimport) extern double PI;```然后,在使用这些函数和数据的源文件中包含这个头文件即可。

4.加载和卸载动态链接库:在程序运行时,需要动态地加载动态链接库,并在使用完之后卸载。

可以使用LoadLibrary函数来加载动态链接库,使用FreeLibrary函数来卸载动态链接库。

动态链接库简介

动态链接库简介

什么是动态链接库?一、动态链接库的概念动态链接库(Dynamic Link Library ,缩写为DLL )是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。

动态链接库文件的扩展名一般是dll ,也有可能是drv 、sys 和fon ,它和可执行文件(exe )非常类似,区别在于DLL 中虽然包含了可执行代码却不能单独执行,而应由Windows 应用程序直接或间接调用。

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

所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。

换句话说,函数和过程的代码就在程序的exe 文件中,该文件包含了运行时所需的全部代码。

当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。

而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。

仅当应用程序被装入内存开始运行时,在Windows 的管理下,才在应用程序与相应的DLL 之间建立链接关系。

当要执行所调用DLL 中的函数时,根据链接产生的重定位信息,Windows 才转去执行DLL 中相应的函数代码。

一般情况下,如果一个应用程序使用了动态链接库,Win32 系统保证内存中只有DLL 的一份复制品,这是通过内存映射文件实现的。

DLL 首先被调入Win32 系统的全局堆栈,然后映射到调用这个DLL 的进程地址空间。

在Win32 系统中,每个进程拥有自己的32 位线性地址空间,如果一个DLL 被多个进程调用,每个进程都会收到该DLL 的一份映像。

与16 位Windows 不同,在Win32 中DLL 可以看作是每个进程自己的代码。

二、动态链接库的优点1 .共享代码、资源和数据使用DLL 的主要目的就是为了共享代码,DLL 的代码可以被所有的Windows 应用程序共享。

2 .隐藏实现的细节DLL 中的例程可以被应用程序访问,而应用程序并不知道这些例程的细节。

动态链接库的使用

动态链接库的使用

动态链接库的使用一、编写合格的动态链接库头文件C语言的头文件,可供一个或多个程序引用,里面一般定义程序所需的常量,自定义类型及函数原型说明等.其中的函数原型说明,则供编译器检查语法,用于排除引用参数时类型不一致的错误.只有编写合格的动态链接库头文件,程序员才能正确使用动态链接库内的函数.动态链接库头文件要采用C语言标准格式,其中的动态函数原型定义,不必象上文介绍的那样用(*动态函数名)的描述形式.请看下面的例子:(每行开始的数字为所在行行号,为笔者添加,供注解使用)1 /* adatetime.h : 纵横软件制作中心雨亦奇(zhsoft@)编写, 2002-03-06. */23 #ifndef __DATETIME_H45 #define __DATETIME_H67 /* 日期结构 */8 typedef struct9 {10 int year;11 int mon;12 int day;13 }DATETYPE;1415 /* 时间结构 */16 typedef struct17 {18 char hour;19 char min;20 char sec;21 }TIMETYPE;2223 int getdate(DATETYPE *d); /* 取当前日期 */24 int gettime(TIMETYPE *t); /* 取当前时间 */2526 #endif注:与上文的datetime.h文件比较,从该头文件第23,24行可以看到,动态函数getdate,gettime的原型定义改变了,不再使用(*getdate),(*gettime)的格式了(这种格式使用较为罗嗦).二、正确编译与命名动态链接库为了让GCC编译器生成动态链接库,编译时须加选项-shared.(这点须牢记)LINUX系统中,为了让动态链接库能被系统中其它程序共享,其名字应符合“lib*.so*”这种格式.如果某个动态链接库不符合此格式,则LINUX的动态链接库自动装入程序(ld.so)将搜索不到此链接库,其它程序也无法共享之.格式中,第一个*通常表示为简写的库名,第二个*通常表示为该库的版本号.如:在我的系统中,基本C动态链接库的名字为libc.so.6,线程pthread动态链接库的名字为libpthread.so.0等等.本文例子所生成的动态链接库的名字为libmy.so,虽没有版本号,但也符合所要求的格式.生成该动态链接库的维护文件makefile-lib内容如下:1 # makefile : 纵横软件制作中心雨亦奇编写, 2002-03-07.23 all : libmy.so45 SRC = getdate.c gettime.c67 TGT = $(SRC:.c=.o)89 $(SRC) : adatetime.h10 @touch $@1112 %.o : %.c13 cc -c $?1415 # 动态链接库(libmy.so)生成16 libmy.so : $(TGT)17 cc -s -shared -o $@ $(TGT)18运行命令:$ make -f makefile-lib$即生成libmy.so库.注: 维护文件中,第17行用-shared选项以生成动态链接库,用-s选项以去掉目标文件中的符号表,从而减小文件长度.三、共享动态链接库3.1 动态链接库配置文件为了让动态链接库为系统所使用,需要维护动态链接库的配置文件 /etc/ld.so.conf 。

第九讲 动态链接库

第九讲 动态链接库
Fundamentals of Computers
第九讲 动态链接库
制作:刘晓翔 暨南大学珠海学院《Windows编程》 2015-6-26
动态链接库
Fundamentals of Computers
JINAN University
内容安排
动态链接库概述 Win32 DLL 的创建 隐式链接方式加载DLL 显式加载方式加载DLL DllMain函数 MFC DLL
void CDllTestDlg::OnAdd() { CString str; str.Format("7 + 5 = %d", add(7,5)); MessageBox(str); }
void CDllTestDlg::OnSubtract() { CString str; str.Format("7 - 5 = %d", subtract(7,5)); MessageBox(str); }
4
暨南大学珠海学院《Windows编程》 2015-6-26
动态链接库概述
Fundamentals of Computers
JINAN University
使用动态链接库的好处
增强程序的扩展性 可以采用多种编程语言来写
提供二次开发的平台
简化项目管理 节省磁盘空间和内存 有助于资源共享
_declspec (dllimport) int add(int a,int b); _declspec (dllimport) subtract(int a,int b);
制作:刘晓翔 暨南大学珠海学院《Windows编程》 2015-6-26
15
隐式链接方式加载DLL

第9章 动态链接库.ppt

第9章 动态链接库.ppt
➢包含导出函数以及类声明的头文件 ➢DLL的导入库LIB文件 ➢实际的DLL文件
2021/6/8 Visual C++程序设计与应用教程
第9章 动态链接库
20
编译时将DLL的LIB文件加入应用程序中,主要有 如下3种方法。
➢在主菜单project中,选择菜单项【Add
To
Project| Files】菜单项,在弹出的
从MFC DLL中导出函数常用以下两种方法:使用模块 定义文件(.DEF)和使用关键字_declspec(dllexport)。
2021/6/8 Visual C++程序设计与应用教程
第9章 动态链接库
11
9.2.1 使用.DEF文件
DEF文件是一个包含EXE文件或DLL文件声明的 文本文件。每个.DEF文件至少必须包含LIBRARY语 句和EXPORTS 语句,其他语句可以省。 DEF文件常用的模块语句如下: ➢第 一 个 语 句 必 须 是 LIBRARY 语 句 , 这 个 语 句 指 出 DLL的名字,链接器将这个名字放到DLL导入库中, DLL导入库包含了指向外部DLL的函数索引指针。
2021/6/8 Visual C++程序设计与应用教程
第9章 动态链接库
17
9.2.3 两种导出函数方法的比较
➢如果需要使用导出顺序值,那么应该使用DEF文 件来导出函数。
➢使用DEF文件来导出函数,可以创建具有NONAME 属性的DLL。
➢使 用 declspec(dllexport) 关 键 字 导 出 函 数 不 需 要编写DEF文件,因此,如果编写的DLL只供自己 使用,使用__declspec(dllexport)较为简单。

什么是动态链接库?

什么是动态链接库?

什么是动态链接库?什么是dll:dll只是一组源代码的模块,每个模块包含一些可供应用程序或者其他dll 调用的函数,在应用程序调用一个dll里面的函数的时候,操作系统会将dll的文件映像映射到进程的地址空间中,这样进程中所有的线程就可以调用dll中的函数了dll加载完成后,这个时候dll对于进程中的线程来说只是一些被放在地址进程空间附加的代码和数据,操作系统为了节省内存空间,同一个dll在内存中只有一个,也就是说如果你的的两个应用程序都需要加载user32.dll,那么操作系统也只会加载一次user32.dll到内存中因为代码段在内存中的权限都是为只读的,所以当多个应用程序加载同一个dll的时候,不用担心应用程序会修改dll的代码段。

当线程调用dll的一个函数,函数会在线程栈中取得传递给他的参数,并使用线程栈来存放他需要的变量,dll函数创建的任何对象都为调用线程或者调用进程拥有,dll不会拥有任何对象,也就是说如果dll中的一个函数调用了VirtualAlloc,系统会从调用进程的地址空间预定地址,即使撤销了对dll的映射,调用进程的预定地址依然会存在,直到用户取消预定或者进程结束。

示例代码:mylib.h1 #ifdef MYLIBAPI2 #else3 #define MYLIBAPI extern "C" __desclspec(dllimport)4 #endif56 MYLIBAPI int g_nResult;78 MYLIBAPI int Add(int nLeft,int nRight)mylib.cpp1 #include <windows.h>23 #define MYLIBAPI extern "C" __declspec(dllexport)4 #include "mylib.h"5 int g_nResult;67 int Add(int nLeft,int nRight)8 {9 g_nResult = nLeft + nRight;10 return g_nResult;11 }输入命令:cl /LDd mylib.cpp可以生成可供调试的dll这个时候会多出四个文件,分别是mylib.exp,mylib.lib,mylib.dll,mylib.objmylib.obj保存的是在链接器生成dll的需要的信息当链接器检测到应用程序导出了一个函数或者变量,链接器就会生成mylib.lib文件,这个只是列出了导出的函数和变量的符号名输入命令查看lib里面的导出段dumpbin -exports mylib.lib我们可以看到这个lib里面export了_Add和_g_nResult如果我们使用dumpbin -imports mylib.libimports里面没有变量或者函数,这是因为lib里面记录的只是导出的函数和变量,只有在声明有导出函数或者变量的时候,才会生成这个文件mylib.dll则是我们最终生成的模块如果使用dumpbin查看mylib.dll的导出导入则因为太多,所以不贴出来到我们需要将一个函数导出的时候,可以使用__desclspec(dllexport)来声明为导出函数,需要从dll使用一个函数的时候,可以使用__desclspecc(dllimport)来前置声明一个函数,当然,也可以不使用import前置声明,但是使用improt可以明确告诉编译器这些函数是从dll导入的,提高效率什么是导出?当将函数或者变量声明为导出后,编译器在生成obj的时候会嵌入一些额外的信息,以便于让链接器在生成dll的时候使用,并且会生成一个记录导出函数和变量的lib文件,在生成可执行文件的时候,我们需要通过链接这个lib来取得dll的一些信息,链接器在生成dll的时候,会在dll文件中嵌入一个导出符号表,这个符号表记录了导出的函数和变量的符号名,并且保存对应的文件偏移量地址,这样当可执行文件需要调用dll里面的函数的时候,可以通过这个符号表来找到对应函数的地址最后我们开始构建可执行文件,代码如下myexe.cpp#include <cstdio>#include "mylib.h"int main(void){int nLeft = 10,nRight = 20;printf("%d\n",Add(nLeft,nRight));}cl myexe.cpp mylib.lib我们在编译的时候一定要链接mylib.lib,这样编译器才知道要到哪里去找mylib的变量和函数相关信息,并且可执行文件也才知道程序需要mylib.dll这个dll,这样程序在加载的时候会搜索用户磁盘上的dll,如果没找到则会报错,找到则将dll映射到进程的内存空间里面当dll映射到进程的内存空间里面后,加载程序会查看在对应的dll的导出段符号是否存在,如果不存在,则报错,如果存在,那么加载程序会将该符号加载到该符号的所在的文件偏移量(RVA,虚拟地址,但在dll里面实际上是该符号所在文件的位置),加上该dll加载的虚拟地址,保存到可执行程序的导入段中,当代码引用到导入符号的时候,可执行文件会去查看导入段并且得到导入符号的地址,这样就能访问导入的变量或者函数。

动态链接库的原理及使用

动态链接库的原理及使用

动态链接库的原理及使用动态链接库(Dynamic Link Library,简称DLL)是一种用于在Windows操作系统中共享程序代码和资源的文件格式。

DLL可以包含多个函数和数据,它们可以被多个应用程序同时使用,提供了一种更加灵活、高效的代码共享方式,使得代码的复用和维护更加方便。

DLL的原理是通过动态链接的方式将DLL文件中的函数和数据加载到内存中,然后在需要使用这些函数和数据的应用程序中进行调用。

这样做的好处是可以减少程序的体积,减少了重复代码的占用空间,提高了程序的运行效率。

DLL的使用分为两个步骤:编写和生成DLL文件,以及在应用程序中调用DLL中的函数和数据。

编写和生成DLL文件的过程通常是使用特定的开发工具或编程语言进行操作。

编写DLL文件时,需要定义导出函数,即可以被其他应用程序调用的函数。

在C/C++语言中,可以使用__declspec(dllexport)关键字来进行函数的导出声明。

生成DLL文件的过程也有多种方式,如使用编译器提供的选项进行生成,或者使用特定的构建工具进行生成。

在应用程序中调用DLL的函数和数据时,首先需要通过LoadLibrary 函数将DLL文件加载到内存中,然后使用GetProcAddress函数获取要调用的函数的地址。

获取到函数地址后,就可以像调用本地函数一样调用DLL中的函数了。

如果DLL中还有需要使用的数据,也可以通过导出的全局变量或者提供的函数来获取和使用。

除了使用LoadLibrary和GetProcAddress函数之外,Windows API 中还提供了一些使用DLL的高级函数调用方式,如使用COM组件、使用注册表等。

1.代码复用:多个应用程序可以共享同一个DLL文件,避免了代码的重复编写,提高了代码的复用性。

2.节省内存:多个应用程序共享一个DLL文件时,DLL中的代码和数据只需要在内存中加载一次,减少了内存的占用。

3.程序的灵活性:使用DLL可以实现模块化的设计和开发,提高了程序的灵活性和可维护性。

动态链接库

动态链接库

动态链接库1、动态链接库概述动态链接库一直就是Windows操作系统的基础。

动态链接库通常都不能直接运行,也不能接收消息。

它们是一些独立的文件,其中包含能被可执行程序或其他DLL调用来完成某项工作的函数。

只有在其他模块调用动态链接库中的函数时,它才发挥作用。

在实际编程时,我们可以把完成某种功能的函数放在一个动态链接库中,然后供给其他程序调用Windows API中的所有函数都包含在DLL中,其中有3个最重要的DLLKernel32.dll:包含那些用于管理内存、进程和线程的函数User32.dll:包含那些用于执行用户界面任务的函数GDI32.dll:包含那些用于画图和显示文本的函数1.1、静态库与动态库静态库:函数和数据被编译进一个二进制文件(扩展名.lib)。

在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.exe文件)。

当发布产品时,只需要发布这个可执行文件,并不需要发布使用的静态库动态库:在使用动态库时,往往提供两个文件:一个引入库(.lib)文件和一个DLL(.dll)文件。

虽然引入库文件的后缀名也是“lib”,但是,动态链接库的引入库文件和静态库文件有着本质的区别,对一个DLL来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。

在使用动态库的情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件中,直到可执行程序运行时,才去加载所需的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出的函数。

这时,在发布产品时,除了发布可执行文件意外,同时还要发布该程序将要调用的动态链接库1.2、使用动态链接库的好处1、可以采用多种语言来编写2、增强产品的功能3、提供二次开发的平台4、简化项目管理5、可以节省磁盘空间和内存当进程被加载时,系统为它分配一个4GB的地址空间,接着分析该可执行模块,找到该程序要调用哪些DLL,然后系统搜索这些DLL,找到后就加载它们,并为它们分配虚拟的内存空间,然后将DLL的页面映射到调用进程的地址空间。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

创建动态链接库项目(非mfc方式)


在Visual Studio 2010中打开“新建项目”对话框,在“项 目类型”列表中,选择“Visual C++”/“Win32”,然 后在右侧的模板列表中选中“Win32项目”。 在“名称”文本框中输入mylib,然后单击“确定”按钮,
Win32应用程序向导
单击“下一步”按钮,打开“应用程序配置”对话框,在“应用程 序”列表中选择“DLL”如图10.3所示。
“应用程序配置”对话框
DllMain()是DLL的入口函数
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH://进程映射 case DLL_THREAD_ATTACH://线程映射 case DLL_THREAD_DETACH://进程卸载 case DLL_PROCESS_DETACH://线程卸载 break; } return TRUE; }
参数说明


hModule,D指定调用DLL入口函数的原因,其取 值如表所示。 lpReserved,指定DLL初始化和清理的方式。当dwReason等 于DLL_PROCESS_ATTACH时,如果lpvReserved为NULL, 则表示动态加载;否则表示静态加载。当dwReason等于 DLL_PROCESS_DETACH时,如果lpvReserved为NULL,则 DllMain()函数由FreeLibrary()函数调用;否则表示在结束进程 时调用DllMain()函数。
在DLL中添加导出函数
extern "C"__declspec(dllexport) int sum(int a, int b) { return a +b; }
在DLL中添加导出类

在DLL项目中添加类的方法和在其他项目中添加类的方法是一 样的。在菜单中选择“项目”/“添加类”,打开“添加类” 窗口。
加载时动态链接

使用加载时动态链接的程序需要引用导入库(*.lib文件)。在引 用DLL的项目中,打开“项目属性”对话框,左侧的“配置属性 ”树中,依次选择“链接器”/“输入”,在右侧的“附加依赖 项”中添加导入库。
提示

在编译和生成程序之前,应将mylib.lib复制到项目目录下。 否则会出现下面的错误。
2.显式链接
显 示 链 接 , 又 称 显 式 调 用 , 是 由 编 程 者 用 API 函 数 LoadLibrary() 加载 DLL、并通过 GetProcessAddress() 来获取应 用程序要调用的导出函数指针来调用 DLL 的导出函数,最后通过 FreeLibrary()卸载DLL。它是一种动态调用的方式,通过它能够 有效地使用内存,是编制大型应用程序的重要方式。
静态链接库



多个应用程序,多个静态链接库的副本 占用较多的内存资源 在静态库情况下,函数和数据被编译进一个二进制文件(通常扩 展名为*.LIB) Visual C++的编译器在处理程序代码时将从静态库中恢复这些 函数和数据并把他们和应用程序中的其他模块组合在一起生成可 执行文件 "静态链接",此时因为应用程序所需的全部内容都是从库中复制 了出来,所以静态库本身并不需要与可执行文件一起发行
静态链接与动态链接

DLL与运行函数库(如C语言的运行函数库)类似,二者主要 区别在于库代码的链接时机不同。 DLL是在运行期间才被链接进来,该操作由Windows操作系 统自身来完成,而运行函数库则是在程序链接期间由应用程序的链 接器如LINK.EXE来完成,运行函数库的链接被称为“静态链接”, 它把函数代码链接到应用程序中,增加了应用程序最终执行代码的 长度。它的主要优点是建立了一个应用程序可以利用的标准函数集。 静态链接库在多任务环境中建立与运行时效率可能很低。一方面, 如果两个应用程序同时运行,且它们使用了同一个静态库中的函数, 那么就要求系统中出现该函数的两个副本,这显然降低了内存的使用 效率。另一方面,对于比较复杂的问题,应用静态链接库将导致最终 的应用程序长度超过系统内存而无法运行。
错误 1 fatal error LNK1104: 无法打开文件 “mylib.lib” MydllTester MydllTester 在运行程序之前,应将mylib.dll复制到应用程序可执行文件 所在的目录下。否则会出现图10.8所示的错误。
【例1】的运行结果
方法二.通过DEF文件指定 动态链接库DLL是通过导出函数和变量来实现代码共享的,外部程序 能通过这个导出过程来访问内部的函数和变量。 在VC 下,除了使用编译指令 dllexport 与dllimport 实现导出、导 入函数的指定外,还可以通过DLL工程中的DEF文件来实现,利用应用程 序向导生成的动态链接库中有一个和工程名同名的一个 .def 文件,例 如建立一个在 mydll.dll的动态链接库,则生成的mydll.def的主要内
“一般C++类向导”窗口
声明为导出类
class _declspec(dllexport) CMath { public: CMath(void); ~CMath(void); };

在类CMath中添加一个sum()函数,代码如下:
int CMath::sum(int a, int b) { return a +b; }


方法一.通过扩展关键字dllexport 与dllimport 指定 从一个动态链接库中导出一个函数可以通过如下的语句来完成 __declspec( dllexport ) void MyFunction(int i) { //动态链接库中的函数MyFunction的实现代码 } 其中__declspec是一个扩展关键字,其作用和具有一个参数的 函数类似,实际上,它与它的“参数”一起构成了一个“标志”,即 “ __declspec( dllexport) ”,该语句的含义为“出现在我后面的 函数在当前的动态链接库文件中被合法导出,外部应用程序可以使用 这个函数”。 从一个动态链接库中导入一个函数可以通过如下的语句来完成 __declspec( dllimpot ) void MyFunction(int i); __declspec(dllimpot ) 的 含 义 为 “ 出 现 在 我 后 面 的 函 数 MyFunction是从动态链接库文件中导入的函数”。

动态链接库是一个文件,其中包含有函数或全局变量,使用他们 就像应用程序使用自己定义的函数一样。用API开发Windows应用 程序,实质就是调用Windows操作系统下的动态链接库。它包含 函数,数据或资源等其他应用程序可用到的东西它可以在需要的时 候随时装入,


Windows操作系统都非常依赖于动态链接库(DLL)中的函数和 数据,实际上Windows操作系统中几乎所有的内容都由DLL以 一种或另外一种形式代表着。 我们在Windows目录下的system32文件夹中会看到 kernel32.dll、user32.dll和gdi32.dll,windows的大多数 API都包含在这些DLL中。kernel32.dll中的函数主要处理内存 管理和进程调度;user32.dll中的函数主要控制用户界面; gdi32.dll中的函数则负责图形方面的操作。 例如一般的程序员都用过类似MessageBox的函数,其实它就包 含在user32.dll这个动态链接库中。由此可见DLL对我们来说其 实并不陌生。
动态链接库
与静态链接库不同,动态链接库则允许若干个应用程序共享某个 函 数 的 单 个 副 本 。 事 实 上 , 每 个 Windows API 函 数 , 如 GetMesssage()、CreateWindow() 和 TextOut() 分别留于动态链接库 —— Kernel32.dll、User32.dll、Gdi32.dll 之中。如果两个应用 程序同时运行,且都使用了某个特定的Windows函数,那么它们将共 享该函数代码的单个副本。DLL除了实现代码的共享外,还可以实现 其它资源的共享,如数据和硬件资源的共享。Windows的设备驱动程 序允许应用程序共享硬件资源,这些设备驱动程序就是以动态链接 库的形式来出现。 从某种程度上讲,动态链接库也是一种类型的计算机资源。一个 动态链接库可以为多个应用程序使用,如果一个应用程序使用了某 个动态链接库中函数,若库不存在,则调用将不能完成。
Windows在加载DLL的时候,需要一个入口函数,就如同控制台或 DOS程序需要main函数、WIN32程序需要WinMain函数一样。根 据编写规范,Windows必须查找并执行DLL里的DllMain函数作为 加载DLL的依据,它使得DLL得以保留在内存里。这个函数并不属 于导出函数,而是DLL的内部函数。这意味着不能直接在应用工程 中引用DllMain函数,DllMain是自动被调用的。
#include "stdafx.h" #include <windows.h> // 从DLL导入的函数 extern “C” int sum(int a, int b);//在使用DLL中的导出函数之前,应 声明函数的原型。 int _tmain(int argc, _TCHAR* argv[]) { printf("4+3 = %d\n", sum(4, 3)); system("Pause"); return 0; }

DLL的优点
共享DLL,节省内存,减少动态交换 不同程序设计语言之间可以共享DLL 减少可执行代码大小 重用代码 大工程可分为易管理的小工程 实现新功能更容易、软件升级 在动态库的情况下,有两个文件 引入库(.LIB)文件 DLL文件 引入库文件包含被DLL导出的函数的名称和位置 DLL包含实际的函数和数据 应用程序使用LIB文件链接到所需要使用的DLL文件
相关文档
最新文档