- 1、本文档共41页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Windows动态链接库基础一-Read.ppt
Windows动态链接库基础一 信息技术部 2009-08-24 一、DLL概述 动态链接库(以下简称DLL) 是Windows操作系统的基础。 Windows API 中的所有函数都包含在DLL中。 最核心的DLL是: Kernel.dll:它包含用于管理内存、进程和线程的各个函数; User.dll:它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数; Gdi32.dll:它包含用于画图和显示文本的各个函数。 根据不同的应用,提供了执行特殊任务的若干DLL,例如,Advapi32.dll .提供了用于实现对象安全性、注册表操作和事件记录的函数; ComDlg32.dll包含常用对话框(如File Open和File Save);ComCtl32.dll则支持所有的常用窗口控件。 二、为什么要使用DLL 1、扩展了应用程序的特性。 由于DLL能够动态地装入进程的地址空间,因此应用程序能够在运行时确定需要执行什么操作,然后装入相应的代码,以便根据需要执行这些操 作。 2、可以用许多种编程语言来编写。 可以使用多种语言来编写DLL。例如,你可以使用Delphi、VB、VC等等来编写。 3、简化了软件项目的管理。 分模块设计的项目,每个人(小组)工作在不同的模块上,管理起来比较容易。 4、有助于节省内存 。 如果两个或多个应用程序使用同一个DLL,那么该DLL的页面只要放入R A M一次,所有的应用程序都可以共享它的各个页面。 C/C++运行期库就是个极好的例子。许多应用程序都使用这个库。如果所有的应用程序都链接到这个静态库,那么s p r i n t f、s t r c p y和m a l l o c等函数的代码就要多次存在于内存中。相反,如果所有这些应用程序链接到DLL C/C++运行期库,那么这些函数的代码就只需要放入内存一次,这意味着内存的使用将更加有效 5、有助于资源的共享 。 DLL可以包含对话框模板、字符串、图标和位图等资源。多个应用程序能够使用DLL来共享这些资源 。 6、有助于应用程序的本地化。 应用程序常常使用DLL对自己进行本地化。例如,只包含代码而不包含用户界面组件的应用程序可以加载包含本地化用户界面组件的DLL。 7、有助于解决平台差异。 不同版本的Wi d n o w s配有不同的函数。开发人员常常想要调用新的函数。但是,如果你的源代码包含了对一个新函数的调用,而你的应用程序将要在不能提供该函数的Windows版本上运行,那么操作系统的加载程序将拒绝运行你的进程 。 即使你实际上从不调用该函数,情况也是这样。如果将这些新函数保存在DLL中,那么应用程序就能够将它们加载到Windows的老版本上。当然,你仍然可以成功地调用该函数。 8、可以用于一些特殊的目的。 Windows使得某些特性只能为DLL所用。例如,只有当DLL中包含某个挂钩通知函数的时候,才能安装某些挂钩(使用SetWindowsHookEx和SetWinEventHook.来进行安装)。可以通过创建必须在DLL中生存的com对象来扩展Windows Explorer的外壳程序。 对于可以由Web浏览器加载的、用于创建内容丰富的Web页的ActiveX控件来说,情况也是一样。 三、DLL与进程的地址空间 创建DLL常常比创建应用程序更容易,因为DLL往往包含一组应用程序可以使用的自主函数。DLL通常是一组源代码模块,每个模块包含了应用程序(可执行文件)或另一个DLL将要调用的一组函数。 当所有源代码文件编译后,它们就像应用程序的可执行文件那样被链接程序所链接。不同的是对于DLL来说,必须设定该连链程序的/DLL开关。这个开关使得链接程序能够向产生的DLL文件映像发出稍有不同的信息,这样,操作系统加载程序就能将该文件映像视为一个D L L而不是应用程序。 在应用程序(或另一个DLL)能够调用DLL中的函数之前,DLL文件映像必须被映射到调用进程的地址空间中。若要进行这项操作,可以使用两种方法中的一种,即加载时的隐含链接(静态链接)或运行期的显式链接(动态链接)。 一旦DLL的文件映像被映射到调用进程的地址空间中, DLL的函数就可以供进程中运行的所有线程使用。实际上, DLL几乎将失去它作为DLL的全部特征。对于进程中的线程来说,DLL的代码和数据看上去就像恰巧是在进程的地址空间中的额外代码和数据一样。 当一个线程调用DLL函数时,该DLL函数要查看线程的堆栈,以便检索它传递的参数,并将线程的堆栈用于它需要的任何局部变量。此外, DLL中函数的代码创建的任何对象均由调用线程所拥有,而DLL本身从来不拥有任何东西。 例如,如果VirtualAlloc函数被
文档评论(0)