码迷,mamicode.com
首页 > 其他好文 > 详细

DLL基础

时间:2020-01-21 16:28:35      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:col   源代码   信息   kernel32   nbsp   pen   有助于   地址空间   编译   

  

Windows API中的所有函数都包含在DLL中。3个最重要的DLL是:

  1)Kernel32.dll:它包含用于管理内存、进程和线程的各个函数

  2)User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数

  3)GDI32.dll,它包含用于画图和显示文本的各个函数。

Windows还配有若干别的DLL,它们提供了用于执行一些特殊任务的函数。AdvAPI32.dll包含用于实现对象安全性、注册表操作和事件记录的函数;ComDlg32.dll包含常用对话框(如File Open和File Save);ComCtl32.DLL则支持所有的常用窗口控件。

1、使用DLL的原因

1)扩展了应用程序的特性

  由于 D L L能够动态地装入进程的地址空间,因此应用程序能够在运行时确定需要执行什么操作,然后装入相应的代码,以便根据需要执行这些操作。

2)可以用许多种编程语言来编写

  可以选择手头拥有的最好的语言来编写DLL。

3)简化了软件项目的管理

  附带的文件应该尽量少,这样,应用程序的初始化时间也会相对少很多。

4)有助于节省内存

  若两个或多个应用程序使用同一个DLL,那么该DLL的页面只要放入RAM(随机存取存储器)一次,所有的应用程序都可以共享它的各个页面。若所有的应用程序都链接到这个库的静态库,那么sprintf、strcpy和malloc等函数的代码就要多次存在于内存中。

5)有助于资源的共享

  DLL可以包含对话框模板、字符串、图标和位图等资源。多个应用程序能够使用DLL来共享这些资源。

6)有助于应用程序的本地化

  一些应用程序不包含用户界面组件只包含代码,可以通过加载包含本地化用户界面组件的 DLL使用用户界面。

7)有助于解决平台差异

  不同版本的 Windows配有不同的函数。若源代码包含了对一个新函数的调用,而你的应用程序将要在不能提供该函数的 Wi n d o w s版本上运行,那么操作系统的加载程序将拒绝运行你的进程,哪怕实际上从不调用该函数。但若将新函数保存在DLL中,应用程序就能够将它们加载到 Windows的老版本上,就可以成功的调用该函数。

8)用于一些特殊的目的

  如是否能安装挂钩函数等。

2、DLL与进程的地址空间

  DLL的创建比应用程序的创建简单,因为D L L往往包含一组应用程序可以使用的自主函数。在D L L中通常没有用来处理消息循环或创建窗口的支持代码。DLL只是一组源代码模块,每个模块包含了应用程序(可执行文件)或另一个 DLL将要调用的一组函数。当所有源代码文件编译后,它们就像应用程序的可执行文件那样被链接程序所链接。但是,对于一个DLL来说,你必须设定该链接程序的 /DLL开关。这个开关使得链接程序能够向产生的DLL文件映像发出稍有不同的信息,这样,操作系统加载程序就能将该文件映像视为一个DLL而不是应用程序。

  在应用程序(或另一个DLL)能够调用DLL中的函数之前,DLL文件映像必须被映射到调用进程的地址空间中。若要进行这项操作,可以使用两种方法中的一种,即加载时的隐含链接或运行期的显式链接。之后DLL的函数就可以供进程中运行的所有线程使用。DLL中函数的代码创建的任何对象均由调用线程所拥有,而DLL本身从来不拥有任何东西。

  DLL中的全局变量和静态变量的处理方法是完全相同的。当一个进程将DLL的映像文件映射到它的地址空间中去时,系统将同时创建全局数据变量和静态数据变量的实例。

  单个地址空间是由一个可执行模块和若干个DLL模块组成的。这些模块中,有些可以链接到静态版本的 C/C++运行期库,有些可以链接到一个DLL版本的C/C++运行期库,而有些模块(如果不是用 C/C++编写的话)则根本不需要C/C++运行期库。

DLL基础

标签:col   源代码   信息   kernel32   nbsp   pen   有助于   地址空间   编译   

原文地址:https://www.cnblogs.com/Sheenagh/p/12221546.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!