动态连接库和静态连接库

DLL 是 Dynamic Link Library 的缩写,译为“动态连接库”。DLL也是一个被编译过的二进制程序,能够被其余程序调用,但与 exe 不一样,DLL不能独立运行,必须由其余程序调用载入内存。

DLL 中封装了不少函数,只要知道函数的入口地址,就能够被其余程序调用。

Windows API中全部的函数都包含在DLL中,其中有3个最重要的DLL:
  • Kemel32.dll:它包含那些用于管理内存、进程和线程的函数,例如CreateThread函数;
  • User32.dll:它包含那些用于执行用户界面任务(如窗口的建立和消息的传送)的函数,例如 CreateWindow 函数;
  • GDI32.dll:它包含那些用于画图和显示文本的函数。

静态连接库和动态连接库

1) 静态库

函数和数据被编译进一个二进制文件(一般扩展名为.LIB)。在使用静态库的状况下, 在编译连接可执行文件时,连接器从库中复制这些函数和数据并把它们和应用程序的其余模块组合起来建立最终的可执行文件(.EXE文件)。当发布产品时,只须要发布这个可执行文件,并不须要发布被使用的静态库。

2) 动态库

在使用动态库的时候,每每提供两个文件:一个引入库(.lib)文件和一个DLL (.dll) 文件。虽然引入库的后缀名也是“lib”,可是,动态库的引入库文件和静态库文件有着本质上的区别,对一个DLL来讲,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。在使用动态库的状况下,在编译连接可执行文件时,只须要连接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件中,直到可执行程序运行时,才去加载所需的DLL,将该DLL映射到进程的地址空间中,而后访问DLL中导出的函数。这时,在发布产品时,除了发布可执行文件之外,同时还要发布该程序将要调用的动态连接库。
也能够这样理解,(.lib)至关于咱们前边多文件编译的(fun.h),(.dll)至关于(fun.c)....

使用动态连接库的好处

1) 能够采用多种编程语言来编写

咱们能够采用本身熟悉的开发语言编写DLL,而后由其余语言编写的可执行程序来调用这些DLL。例如,能够利用VB来编写程序的界面,而后调用利用VC++或Delphi编写的完成程序业务逻辑的DLL。

2) 加强产品的功能

在发布产品时,能够发布产品功能实现的动态连接库规范,让其余公司或我的遵守这个规范开发本身的DLL,以取代产品原有的DLL,让产品调用新的DLL,从而实现功能 的加强。在实际工做中,咱们看到许多产品都提供了界面插件功能,容许用户动态地更换程序的界面,这就能够经过更换界面DLL来实现。

3) 提供二次开发的平台

在销售产品的同时,能够采用DLL的形式提供一个二次开发的平台,让用户能够利用该DLL调用其中实现的功能,编写符合本身业务须要的产品,从而实现二次开发。

4) 简化项目管理

在一个大型项目开发中,一般都是由多个项目小组同时开发,若是采用串行开发,则效率是很是低的。咱们能够将项目细分,将不一样功能交由各项目小组以多个DLL的方式实现,这样,各个项目小组就能够同时进行开发了。

5) 能够节省磁盘空间和内存

若是多个应用程序须要访问一样的功能,那么能够将该功能以DLL的形式提供,这样在机器上只须要存在一份该DLL文件就能够了,从而节省了磁盘空间。另外,若是多个应用程序使用同一个DLL,该DLL只须要放入内存一次,全部的应用程序就均可以共亨它了。这样,内存的使用将更加有效。

咱们知道,当进程被加载时,系统会为它分配内存,接着分析该可执行模块,找到该程序将要调用哪些DLL,而后系统搜索这些DLL,找到后就加载它们,并为它们分配内存空间。DLL的内存空间只有一份,若是有第二个程序也须要加载该DLL,那么它们共享内存空间,相同的DLL不会再次加载。

6) 有助于资源的共享

DLL能够包含对话框模板、字符串、图标和位图等多种资源,多个应用程序可使用DLL来共享这些资源。在实际工做中,能够编写一个纯资源的动态连接库,供其余应用程序访问。

7) 有助于实现应用程序的本地化

若是产品须要提供多语言版本,那么就可使用DLL来支持多语言。能够为每种语言建立一个只支持这种语言的动态连接库。
相关文章
相关标签/搜索