资源预览内容
第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
第9页 / 共14页
第10页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第18章 二进制码功能模块动态链接库(DLL)动态链接库(DLL)是一种软件模块,使用动态链接库可以很方便地将开发者编写的功能模块应用到不同语言的程序中。使用动态链接库更方便的在于不必重新编译该DLL中的代码逻辑,缩短了编译调试的时间,从而大大提高了软件进化的效率。本章的主要内容如下。DLL理论基础:读者将学会DLL理论的基础理论,了解DLL导入导出的基本原理、隐式和显式连接,以及符号和序号连接等基本概念。DLL自动化组件的开发:读者将学会使用自动化来开发DLL组件,通过实例,掌握DLL自动化接口的开发。DLL的调用:通过实例实践,读者将学会调用自己开发的DLL组件,并学会在VB Script和JavaScript中使用。18.1 DLL理论基础DLL文件是一种可执行文件,但它不能像EXE可执行文件一样在Windows系统平台直接运行,它需要有其他应用程序作为运行母体,许多大的软件程序(如Windows操作系统)都由很多模块(多个功能)组成,这些模块分别完成相对独立的功能,它们可以拆分出来重组,又可以彼此协作来完成整个软件系统的工作。在开发软件系统时,如果将所有模块的源代码都集成到整个应用程序 EXE 文件中,会产生一些问题:增加应用程序的体积,使得应用程序过于庞大,浪费存储空间和内存消耗。在开发这种“综合型”应用程序时,需要更多的编译时间和更高的逻辑复杂度,客观上造成了软件开发的困难。18.1.1 DLL导入和导出的原理DLL文件中如何导出或导入功能函数的呢?它的接口就在于DLL文件中包含的导出函数表,客户程序可以通过表中的函数ID或符号函数来识别并调用这些功能函数。也就是说,客户程序使用DLL文件时,无需知道它调用的函数地址(而且在调用前,DLL还没有加载到内存中,自然就没有地址),只需要提供函数符号或函数ID即可。当客户程序提交调用函数信息后,动态链接库的进程将会建立一张表,这张表将客户的调用和DLL文件中函数的地址连接起来。如果仅仅是对DLL文件中的函数功能进行修改,则无需改动客户程序或重新注册DLL文件,这点与同一个项目中的函数调用是一致的。只有当DLL功能提供者改变了DLL中的自动化接口才需要修改客户程序,但也无需重新注册。18.1.2 隐式和显式连接隐式连接是在Visual C+中常用的DLL连接方法,当开发环境创建DLL文件时,系统也会生成一个“*.LIB”文件,该文件就包含了导出符号和序号等基本信息,当客户程序装载DLL文件时,Windows操作系统将自动根据符号来选择连接,隐式连接常用于编译型的程序设计语言中。显式连接常用于解析型的编程语言,如VB Script、Javascript等,显示连接不用导入DLL文件进行连接,而是在解释时调用LoadLibrary()函数等函数将DLL的自动化类导入进来,假设有一个DLL编写了一个可以导出的函数:extern”C” _declspec(DLLexport) double Add(double n1,double n2);18.1.3 符号和序号连接符号连接其实就是通过函数名的调用进行的连接,而序号连接则调用函数序号进行连接,它的优势在于客户程序的执行文件将比前者更小,不必使用导入函数名等一系列代码操作。下面是从MFC库的DEF文件中摘抄出来的一部分:?0_AFX_SOCK_STATEQAEXZ 256 NONAME?0CAsyncSocketQAEXZ 257 NONAME?0CNoTrackObjectQAEXZ 258 NONAME?0CSocketQAEXZ 259 NONAME?0CSocketFileQAEPAVCSocketHZ 260 NONAME?0CSocketWndQAEXZ 261 NONAME18.1.4 DllMain()函数DLL文件不是执行文件,不能直接执行,也就是它天生就是被其他客户程序使用的,当DLL文件被加载时,将会调用_DllMainCRTStartup()函数,该函数调用全局对象的构造函数,而全局对象的构造函数体中调用了全局函数DllMain()。当开发者不定义DllMain()函数时,系统将自动生成一个不做任何事情的DllMain()函数。以下代码是DllMain()函数框架如代码示例18.2所示。18.2 DLL使用实例定义DLL函数并使用【本小节示例参考:源代码C18myMath】本节简介使用MFC库进行DLL的开发和使用,具体操作是使用应用程序向导创建MFC DLL项目,然后在Windows系统中注册该DLL文件,最后使用VB Script和HTML中的Javascript来调用该DLL的功能函数。本节的实例是开发一个数学DLL,这个DLL封装了一些常用的数学函数,主要如下:求两个数之和:传递参数为两个实数,返回值为两个参数之和。求圆的面积:传递参数是圆的半径,返回值为圆的面积。求平面坐标中任意两点的距离:通过传递两个点的坐标,返回两个点的距离。18.2.1 创建MFC DLL自动化项目MFC DLL是使用Visual C+6.0常开发的DLL项目模式,在Visual C+6.0中使用MFC类型的DLL开发,可以将MFC的代码框架优势充分表现出来,使程序设计更加快捷的同时,也不至于出现更抽象的函数调用,MFC DLL项目创建步骤如下:18.2.2 添加自动化类和成员函数MFC DLL要提供自动化函数才能提供对外接口,而自动化函数需要定义一个自动化的类,创建该类后再添加3个基本的数学运算功能。求两个数之和:传递参数为两个实数,返回值为两个参数之和。求圆的面积:传递参数是圆的半径,返回值为圆的面积。求平面坐标中任意两点的距离:通过传递两个点的坐标,返回两个点的距离。18.2.3 在Windows中注册自定义的DLL动态链接库如果DLL文件没有在Windows系统中注册,则客户程序则不知道该DLL文件存放在何处,甚至不知道该DLL文件是否存在。因此,使用自定义DLL文件需要先向操作系统注册。以本小节的DLL文件为例,在Windows系统注册DLL的步骤如下:18.2.4 使用非Visual C+应用程序调用自定义DLLVB Script脚本语言在Windows应用程序和Web应用程序中非常常用,也是使用DLL,操作步骤如下:18.2.5 开发小结本节以VB Script和HTML中使用Javascript来调用DLL文件的方式来测试MFC DLL项目,其实DLL是二进制文件代码,它可以被任何程序设计语言调用,如Delph、Java或PASCAL等。读者容易弄错的地方主要有两个。理所当然地认为可以随意手动添加自动化函数:虽然使用集成开发环境添加的代码都可以使用手动输入,理论上是成立的,但读者容易忽略idl文件的改写,并且在idl文件改写中容易出现语法错误。DLL文件没有在Windwos中注册:出现该问题,将导致在VB Script的定义对象语句出现找不到该模块的错误:Set obj = CreateObject(myMath.MathMyDll)DLL动态链接库技术使得不同编程语言中的代码模块共享成为可能,并形成一种行的软件架构趋势,如C+程序员也可以很方便地使用C+语言编写ASP服务器端的应用程序模块,一方面可以使用自己熟手的语言开发复杂的逻辑,另外也提高了ASP服务器端程序的运行效率。18.3 小结本章是DLL自动化组件开发的章节,着重介绍了自动化理论和DLL动态链接库的开发和使用。通过本章的学习,读者应该掌握的内容如下:DLL理论基础:理解DLL理论的基础理论,了解DLL导入导出的基本原理、隐式和显式连接,以及符号和序号连接等基本概念。DLL自动化组件的开发:熟练掌握使用自动化来开发DLL组件,并掌握DLL自动化接口的开发。DLL的调用:熟练掌握调用自己开发的DLL组件,并掌握在VB Script和JavaScript中使用。本章习题一、填空题1 1COM的中文全称是_。2 2DLL的中文全称是_。二、选择题1 1关于组件的说法,以下说法正确的是( )。A组件可以降低软件的复杂度和维护成本。B组件不稳定,不适合软件工程应用。C组件只提供函数接口。D组件安全性高,可以随意在Web浏览器中运行。2 2关于组件的使用,以下说法错误的是( )。A组件可以在Web应用程序开发中调用。B使用C+开发的组件只能使用在C+语言上。C组件可以通过Web服务器前台代码调用。DJAVA编写的组件可以在C+中调用。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号