DLL动态链接库基础.doc
文本预览下载声明
动态链接库--- DLL基础 从Microsoft公司推出第一个版本的Windows操作系统以来,动态链接库(DLL)一直是这个操作系统的基础。WindowsAPI中的所有函数都包含在DLL中。3个最重要的DLL是Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;GDI32.dll,它包含用于画图和显示文本的各个函数。Windows还配有若干别的DLL,它们提供了用于执行一些特殊任务的函数。例如,AdvAPI32.dll包含用于实现对象安全性、注册表操作和事件记录的函数;ComDlg32.dll包含常用对话框(如FileOpen和FileSave);ComCtl32.dll则支持所有的常用窗口控件。 本章将要介绍如何为应用程序创建DLL。下面是为什么要使用DLL的一些原因: 1、它们扩展了应用程序的特性。由于DLL能够动态地装入进程的地址空间,因此应用程序能够在运行时确定需要执行什么操作,然后装入相应的代码,以便根据需要执行这些操作。例如,当一家公司开发了一种产品,想要让其他公司改进或增强该产品的功能时,那么就可以使用DLL。 2、它们可以用许多种编程语言来编写。可以选择手头拥有的最好的语言来编写DLL。也许你的应用程序的用户界面使用MicrosoftVisualBasic编写得最好,但是用C++来处理它的商用逻辑更好。系统允许VisualBasic程序加载C++DLL、CobolDLL和FortranDLL等。 3、它们简化了软件项目的管理。如果在软件开发过程中不同的工作小组在不同的模块上工作,那么这个项目管理起来比较容易。但是,应用程序在销售时附带的文件应该尽量少一些。我知道有一家公司销售的产品附带了100个DLL――每个程序员最多有5个DLL。这样,应用程序的初始化时间将会长得吓人,因为系统必须打开100个磁盘文件之后,程序才能执行它的操作。 4、它们有助于节省内存。如果两个或多个应用程序使用同一个DLL,那么该DLL的页面只要放入RAM一次,所有的应用程序都可以共享它的各个页面。C/C++运行期库就是个极好的例子。许多应用程序都使用这个库。如果所有的应用程序都链接到这个静态库,那么sprintf、strcpy和malloc等函数的代码就要多次存在于内存中。但是,如果所有这些应用程序链接到DLLC/C++运行期库,那么这些函数的代码就只需要放入内存一次,这意味着内存的使用将更加有效。 5、它们有助于资源的共享。DLL可以包含对话框模板、字符串、图标和位图等资源。多个应用程序能够使用DLL来共享这些资源。 6、它们有助于应用程序的本地化。应用程序常常使用DLL对自己进行本地化。例如,只包含代码而不包含用户界面组件的应用程序可以加载包含本地化用户界面组件的DLL。 7、它们有助于解决平台差异。不同版本的Windows配有不同的函数。开发人员常常想要调用新的函数(如果它们存在于主机的Windows版本上的话)。但是,如果你的源代码包含了对一个新函数的调用,而你的应用程序将要在不能提供该函数的Windows版本上运行,那么操作系统的加载程序将拒绝运行你的进程。即使你实际上从不调用该函?,情况也是这样。如果将这些新函数保存在DLL中,那么应用程序就能够将它们加载到Windows的老版本上。当然,你仍然可以成功地调用该函数。 8、它们可以用于一些特殊的目的。Windows使得某些特性只能为DLL所用。例如,只有当DLL中包含某个挂钩通知函数的时候,才能安装某些挂钩(使用SetWindowsHookEx和SetWinEventHook来进行安装)。可以通过创建必须在DLL中生存的COM对象来扩展WindowsExplorer的外壳程序。对于可以由Web浏览器加载的、用于创建内容丰富的Web页的ActiveX控件来说,情况也是一样. 动态链接库(2) DLL与进程的地址空间 创建DLL常常比创建应用程序更容易,因为DLL往往包含一组应用程序可以使用的自主函数。在DLL中通常没有用来处理消息循环或创建窗口的支持代码。DLL只是一组源代码模块,每个模块包含了应用程序(可执行文件)或另一个DLL将要调用的一组函数。当所有源代码文件编译后,它们就像应用程序的可执行文件那样被链接程序所链接。但是,对于一个DLL来说,你必须设定该连链程序的/DLL开关。这个开关使得链接程序能够向产生的DLL文件映像发出稍有不同的信息,这样,操作系统加载程序就能将该文件映像视为一个DLL而不是应用程序。 在应用程序(或另一个DLL)能够调用DLL中的函数之前,DLL文件映像必须被映射到调
显示全部