ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:27.78KB ,
资源ID:11768522      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11768522.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(软件模块化概述与技术.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

软件模块化概述与技术.docx

1、软件模块化概述与技术软件工程发展到今天,从一开始的结构化编程,到面向对象编程,再到现在的COM编程,目标只有一个,就是希望软件能象积方块一样是累起来的,是组装起来的,而不是一点点编出来的。结构化编程是函数块的形式,通过把一个软件划分成许多模块,每个模块完成各自不同的功能,尽量做到高内聚低藕合,这已经是一个很好的开始,我们可以把不同的模块分给不同的人去做,然后合到一块,这已经有了组装的概念了。软件工程的核心就是要模块化,最理想的情况就是100%内聚0%藕合。整个软件的发展也都是朝着这个方向走的。结构化编程方式只是一个开始。下一步就出现了面向对象编程,它相对于面向功能的结构化方式是一个巨大的进步。

2、我们知道整个自然界都是由各种各样不同的事物组成的,事物之间存在着复杂的千丝万缕的关系,而正是靠着事物之间的联系、交互作用,我们的世界才是有生命力的才是活动的。我们可以认为在自然界中事物做为一个概念,它是稳定的不变的,而事物之间的联系是多变的、运动的。事物应该是这个世界的本质所在。面向对象的着眼点就是事物,就是这种稳定的概念。每个事物都有其固有的属性,都有其固有的行为,这些都是事物本身所固有的东西,而面向对象的方法就是描述出这种稳定的东西。而面向功能的模块化方法它的着眼点是事物之间的联系,它眼中看不到事物的概念它只注重功能,我们平常在划分模块的时侯有没有想过这个函数与哪些对象有关呢?很少有人这么

3、想,一个函数它实现一种功能,这个功能必定与某些事物想联系,我们没有去掌握事物本身而只考虑事物之间是怎么相互作用而完成一个功能的。说白了,这叫本末倒置,也叫急功近利,因为不是我们智慧不够,只是因为我们没有多想一步。面向功能的结构化方法因为它注意的只是事物之间的联系,而联系是多变的,事物本身可能不会发生大的变化,而联系则是很有可能发生改变的,联系一变,那就是另一个世界了,那就是另一种功能了。如果我们用面向对象的方法,我们就可以以不变应万变,只要事先把事物用类描述好,我们要改变的只是把这些类联系起来的方法,只是重新使用我们的类库,而面向过程的方法因为它构造的是一个不稳定的世界,所以一点小小的变化也可

4、能导致整个系统都要改变。然而面向对象方法仍然有问题,问题在于重用的方法。搭积木式的软件构造方法的基础是有许许多多各种各样的可重用的部件、模块。我们首先想到的是类库,因为我们用面向对象的方法产生的直接结果就是许多的类。但类库的重用是基于源码的方式,这是它的重大缺陷。首先它限制了编程语言,你的类库总是用一种语言写的吧,那你就不能拿到别的语言里用了。其次你每次都必须重新编译,只有编译了才能与你自己的代码结合在一起生成可执行文件。在开发时这倒没什么,关键在于开发完成后,你的EXE都已经生成好了,如果这时侯你的类库提供厂商告诉你他们又做好了一个新的类库,功能更强大速度更快,而你为之心动又想把这新版的类库

5、用到你自己的程序中,那你就必须重新编译、重新调试!这离我们理想的积木式软件构造方法还有一定差距,在我们的设想里希望把一个模块拿出来再换一个新的模块是非常方便的事,可是现在不但要重新编译,还要冒着很大的风险,因为你可能要重新改变你自己的代码。另一种重用方式很自然地就想到了是DLL的方式。Windows里到处是DLL,它是Windows 的基础,但DLL也有它自己的缺点。总结一下它至少有四点不足。(1)函数重名问题。DLL里是一个一个的函数,我们通过函数名来调用函数,那如果两个DLL里有重名的函数怎么办?(2)各编译器对C函数的名称修饰不兼容问题。对于C函数,编译器要根据函数的参数信息为它生成修饰

6、名,DLL库里存的就是这个修饰名,但是不同的编译器产生修饰的方法不一样,所以你在VC 里编写的DLL在BC里就可以用不了。不过也可以用extern C;来强调使用标准的C函数特性,关闭修饰功能,但这样也丧失了C的重载多态性功能。(3)路径问题。放在自己的目录下面,别人的程序就找不到,放在系统目录下,就可能有重名的问题。而真正的组件应该可以放在任何地方甚至可以不在本机,用户根本不需考虑这个问题。(4)DLL与EXE的依赖问题。我们一般都是用隐式连接的方式,就是编程的时侯指明用什么DLL,这种方式很简单,它在编译时就把EXE与DLL绑在一起了。如果DLL发行了一个新版本,我们很有必要重新链接一次,

7、因为DLL里面函数的地址可能已经发生了改变。DLL的缺点就是COM的优点。首先我们要先把握住一点,COM和DLL一样都是基于二进制的代码重用,所以它不存在类库重用时的问题。另一个关键点是,COM本身也是DLL,既使是ActiveX控件.ocx它实际上也是DLL,所以说DLL在还是有重用上有很大的优势,只不过我们通过制订复杂的COM协议,通COM本身的机制改变了重用的方法,以一种新的方法来利用DLL,来克服DLL本身所固有的缺陷,从而实现更高一级的重用方法。COM没有重名问题,因为根本不是通过函数名来调用函数,而是通过虚函数表,自然也不会有函数名修饰的问题。路径问题也不复存在,因为是通过查注册表

8、来找组件的,放在什么地方都可以,即使在别的机器上也可以。也不用考虑和EXE的依赖关系了,它们二者之间是松散的结合在一起,可以轻松的换上组件的一个新版本,而应用程序混然不觉。 关于软件模块化VC+ 2010-03-05 17:15:32 阅读101 评论0 字号:大中小订阅 对于大型软件应该将软件细分为各种小的模块,在这里列出一些方法。(1)DLL(2)COM(3)EXE分离在应用程序开发方面推荐的方式是使用 C+ Builder 编写界面,VC 编写功能模块,通过DLL或者COM方式来进行整合。DLL优点:(1)可以使用不同语言编写,同样也可以被不同的语言所调用,例如C+ Builder调用V

9、C编写的DLL。在DLL中可以加入丰富的额外功能,例如对话框等。编写DLL推荐使用VC,(2)VC编写的DLL生成的目标文件比较小。(3)可以使用特定语言支持的类库,例如可以在VC编写的DLL里面使用MFC类库,在C+ Builder 编写的DLL里面使用 VCL 类库。(4)方便程序构架的管理,通过将DLL按功能进行分类,可以为日后的升级和修改BUG提供帮助。(5)缩小主程序的体积,加快主界面的启动速度。DLL缺点:(1)编写调用语句稍微复杂一点,(2)暂时只支持C风格的变量类型。字符串只支持 char*但DLL也有它自己的缺点。总结一下它至少有四点不足。(1)函数重名问题。DLL里是一个一

10、个的函数,我们通过函数名来调用函数,那如果两个DLL里有重名的函数怎么办?(2)各编译器对C函数的名称修饰不兼容问题。对于C函数,编译器要根据函数的参数信息为它生成修饰名,DLL库里存的就是这个修饰名,但是不同的编译器产生修饰的方法不一样,所以你在VC 里编写的DLL在BC里就可以用不了。不过也可以用extern C;来强调使用标准的C函数特性,关闭修饰功能,但这样也丧失了C的重载多态性功能。(3)路径问题。放在自己的目录下面,别人的程序就找不到,放在系统目录下,就可能有重名的问题。而真正的组件应该可以放在任何地方甚至可以不在本机,用户根本不需考虑这个问题。(4)DLL与EXE的依赖问题。我们

11、一般都是用隐式连接的方式,就是编程的时侯指明用什么DLL,这种方式很简单,它在编译时就把EXE与DLL绑在一起了。如果DLL发行了一个新版本,我们很有必要重新链接一次,因为DLL里面函数的地址可能已经发生了改变。DLL的缺点就是COM的优点。COM优点:(1)可使用不同语言编写COM(2)软件更具模块化(3)接口调用方便COM缺点:(1)在 C+ Builder 中调用 VC 编写的 COM 由于需要先导入类库,所以会增加主应用程序体积。EXE分离优点:(1)各模块独立,不相互影响。EXE分离缺点:(1)接口间调用不方便。dll编写与调用.net 2009-09-16 18:27:52 阅读4

12、3 评论0 字号:大中小订阅 项目可能要用到dll的知识,所以现在恶补。 什么是DLL?就是Dynamic Link Library 动态链接库。 作用就是共享函数库的可执行文件。通俗的说,就是加载了别人或自己的DLL后,就可以调用DLL里面定义好的类的方法。 如何编写:创建一个类(类名为myClass),写好你要用到方法,注意类是共有的,方法是static的。 如何把cs文件变成dll文件?把编写好的类放在C:Program FilesMicrosoft Visual Studio 8VC下,打开Visual Studio 2005 命令提示,输入csc /target:library /o

13、ut:myDLL.dll myClass.cs, 按回车。就会在C:Program FilesMicrosoft Visual Studio 8VC下生成myDLL.dll。myDLL.dll就是myClass变成的dll文件,可以给其他项目加载了。 如何加载:打开vs2005,在“解决方案资源管理器”下面,右击“引用”,添加引用,把myDLL.dll加载进来。 如何调用myDLL.dll里面的方法? 1. 相同命名空间的情况:myClass.方法 2. 不用的命名空间的情况: 加上using 命名空间名(如myName),则myName.myClass.方法以上仅代表个人意见dll 文件的编

14、写与调用vc+ 2009-12-15 18:02:40 阅读56 评论2 字号:大中小订阅 /建立DLL文件用Visual Sudio 6.0新建一个工程,工程的类型选择Win32 Dynamic-Link Library.工程名DLL,空dll工程文件新建一个cpp和一个.h文件,代码如下:/.h文件extern C_declspec(dllexport) intadd(int a ,int b);/注意函数返回值一定要在_declspec(dllexport)之后,否则会出现不可预期的结果/.cpp文件int add(int a ,int b)return a+b;用_declspec(d

15、llexport)指明该函数为导出函数(可供外部程序使用),而非内部使用函数用extern C来表示编译器不要重命名,同时指向所有调用指向同一实体编译,我们会发现项目BUG下会产生一个.dll文件和一个.lib文件如果没有_declspec(dllexport)关键字,我们用depends工具打开编译后产生的(bug文件下)这个.dll文件,我们会发现什么也没有.如果没有extern C关键字,我们查看该.dll文件的时候,后发现类似?addYAHHHZ的函数除了用_declspec(dllexport)指明要导出的函数,用extern C来纠正名字,我们还可用一个.def文件来达到以上目的在

16、dll工程里新建一个文件,类型选Text File,在名字要带上后缀.def内容如下:LIBRARYEXPORTSadd同时我们还可以重命名,如下:LIBRARYEXPORTSmyadd = add使得导出的函数叫myadd,而不是add/调用.dll文件1,隐式连接.将制作好的.dll.lib.h三个文件COPY到你要用的工程下,然后在工程中加入:该资源,最后头文件中写上#include somedll.h#pragma comment(lib,somedll.lib)somedll.lib 其中somedll是你要调用的库的名字.然后直接调用你的funa就可以了2.显式连接typedef

17、int (* lpFuna)(int,int);int main(int argc, char* argv) HINSTANCE hDll; lpFuna Funa;hDll = LoadLibrary(a.dll);if (hDll != NULL)/ Funa = (lpFuna)GetProcAddress(hDll,Funa); Funa = (lpFuna)GetProcAddress(hDll,MAKEINTRESOURCE(2); /MAKEINTRESOURCE直接使用导出文件中的序号 if(Funa!=NULL) int result = Funa(2,3); printf(

18、ncall add in dll:%d,result); FreeLibrary(hDll);Visual C+ - DLL 文件的编写和显示调用Visual C+ 2009-09-23 19:49:45 阅读51 评论0 字号:大中小订阅 初步学习VC下的dll文件,查了很多资料,发现很少有讲解很全面的文章,这样的文章对新手来说只是一个大概,作为新手,我谈一下我的感受,第一次接触dll文件的时候,dll就是一个函数库,可以提供被调用的函数, 并且在Application中如果碰到要更新文件时不用重新生成新的Application,这样方便了设计流程和维护,更能体现编程过程中模块独立性。下面就

19、提供一个简单的程序,给新手参考:在VC下生成创建一个Win32 Dynamic-Link Library Project; 同时选择生成一个空的DLL项目,这时你有两个文件要添加:1):在项目工程Souce File文件夹 下添加一个myDll.cpp文件,内容如下:#include stdio.h#include stdafx.h#include iostream.h#include int Max(int a, int b) if(a=b) return a; else return b; int Min(int a, int b) if(a=b) return b; else retur

20、n a;2):在项目工程Souce File文件夹 下添加一个myDll.def文件,内容如下:LIBRARY myDllEXPORTS MaxMin完成后重新生成以下,这时你可以看到在Debug下面有一个myDll.dll文件,表明生成成功。调用:在另外建一个工程用来调用这个myDll.dll,首先你要把myDll.dll文件放到新工程的Debug目录下供调用使用,然后输入一下代码:/ dllTest.cpp : Defines the entry point for the console application./#include stdafx.h#include iostream.h#

21、include void main() HMODULE hi = :LoadLibrary(dll.dll);typedef void (*pMax)(int a,int b);pMax pmax = (pMax)GetProcAddress(hi,Max);int maxInt = pmax(4,2);cout maxIntendl; 正确完成以上操作后你就可以运行了。VC+ DLL 学习札记默认分类 2010-09-03 13:13:56 阅读15 评论0 字号:大中小订阅 1. VC+ 静态链接库 Win32 Static Library #pragma comment( lib , .

22、debuglibTest.lib )的意思是指本文件生成的.obj文件应与libTest.lib一起连接。如果不用#pragma comment指定,则可以直接在VC+中设置,依次选择tools、options、directories、library files菜单或选项,填入库文件路径。#pragma comment(lib,dllTest.lib) /.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息2. Win32 Dynamic-Link Library 非MFC DLL1)typedef int(*lpAddFun)(int, int); /宏定义函数指针类型2)lpAddF

23、un addFun; /函数指针首先,语句typedef int ( * lpAddFun)(int,int)定义了一个与add函数接受参数类型和返回值均相同的函数指针类型。随后,在main函数中定义了lpAddFun的实例addFun;其次,在函数main中定义了一个DLL HINSTANCE句柄实例hDll,通过Win32 Api函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDll;再次,在函数main中通过Win32 Api函数GetProcAddress得到了所加载DLL模块中函数add的地址并赋给了addFun。经由函数指针addFun进行了对DLL中add

24、函数的调用;最后,应用工程使用完DLL后,在函数main中通过Win32 Api函数FreeLibrary释放了已经加载的DLL模块。3).def文件的规则为:(1)LIBRARY语句说明.def文件相应的DLL;(2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);(3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。4)DLL的静态调用方式(1)告诉编译器与DLL相对应的.lib文件所在的路径及文件名,#pragma comment(lib,dllT

25、est.lib)就是起这个作用。程序员在建立一个DLL文件时,连接器会自动为其生成一个对应的.lib文件,该文件包含了DLL 导出函数的符号名及序号(并不含有实际的代码)。在应用程序里,.lib文件将作为DLL的替代文件参与编译。(2)声明导入函数,extern C _declspec(dllimport) add(int x,int y)语句中的_declspec(dllimport)发挥这个作用。静态调用方式不再需要使用系统API来加载、卸载DLL以及获取DLL中导出函数的地址。这是因为,当程序员通过静态链接方式编译生成应用程序时,应用程序中调用的与.lib文件中导出符号相匹配的函数符号将

26、进入到生成的EXE 文件中,.lib文件中所包含的与之对应的DLL文件的文件名也被编译器存储在 EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows将根据这些信息发现并加载DLL,然后通过符号名实现对DLL 函数的动态链接。这样,EXE将能直接通过函数名调用DLL的输出函数,就象调用程序内部的其他函数一样。5)DLL的动态调用方式由“LoadLibrary-GetProcAddress-FreeLibrary”系统Api提供的三位一体“DLL加载-DLL函数地址获取-DLL释放”方式,这种调用方式称为DLL的动态调用。动态调用方式的特点是完全由编程者用 API 函数加载和卸

27、载 DLL,程序员可以决定 DLL 文件何时加载或不加载,显式链接在运行时决定加载哪个 DLL 文件。6)DllMain函数Windows在加载DLL的时候,需要一个入口函数,就如同控制台或DOS程序需要main函数、WIN32程序需要WinMain函数一样。在前面的例子中,DLL并没有提供DllMain函数,应用工程也能成功引用DLL,这是因为Windows在找不到DllMain的时候,系统会从其它运行库中引入一个不做任何操作的缺省DllMain函数版本,并不意味着DLL可以放弃DllMain函数。7)_stdcall约定如果通过VC+编写的DLL欲被其他语言编写的程序调用,应将函数的调用方

28、式声明为_stdcall方式,WINAPI都采用这种方式,而C/C+缺省的调用方式却为_cdecl。_stdcall方式与_cdecl对函数名最终生成符号的方式不同。若采用C编译方式(在C+中需将函数声明为extern C),_stdcall调用约定在输出函数名前面加下划线,后面加“”符号和参数的字节数,形如_functionnamenumber;而_cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。3. MFC规则DLL -Regular DLLMFC规则DLL的概念体现在两方面:(1) 它是MFC的“是MFC的”意味着可以在这种DLL的内部使用MFC;(2) 它

29、是规则的“是规则的”意味着它不同于MFC扩展DLL,在MFC规则DLL的内部虽然可以使用MFC,但是其与应用程序的接口不能是MFC。而MFC扩展DLL与应用程序的接口可以是MFC,可以从MFC扩展DLL中导出一个MFC类的派生类。Regular DLL能够被所有支持DLL技术的语言所编写的应用程序调用,当然也包括使用MFC的应用程序。在这种动态连接库中,包含一个从CWinApp继承下来的类,DllMain函数则由MFC自动提供。4.MFC扩展DLL -Extension DLLMFC扩展DLL与MFC规则DLL的相同点在于在两种DLL的内部都可以使用MFC类库,其不同点在于MFC扩展DLL与应

30、用程序的接口可以是MFC的。MFC扩展DLL的含义在于它是MFC的扩展,其主要功能是实现从现有MFC库类中派生出可重用的类。MFC扩展DLL使用MFC 动态链接库版本,因此只有用共享MFC 版本生成的MFC 可执行文件(应用程序或规则DLL)才能使用MFC扩展DLL。关于三个概念:ActiveX、OLE和COM熟悉面向对象编程和网络编程的人一定对ActiveX、OLE和COM/DCOM这些概念不会陌生,但是它们之间究竟是什么样的关系,对许多人还是比较模糊的。 在具体介绍它们的关系之间,我们还是先明确组件(Component)和对象(Object)之间的区别。 组件是一个可重用的模块,它是由一组处理过程、数据封装和用户接口组成的业务对象(Rules Object)。组件看起来像对象,但不符合对象的学术定义。它们的主要区别是: 1)组件可以在另一个称为容器(有时也称为承载者或宿主)的应用程序中使用,也可以作为独立过程使用; 2)组件可以由一个类构成,也可以由多个类组成,或者是一个完整的应用程序; 3)组件为模块重用,而对象为代码重用。 现在,比较流行的组件模型有COM(Component Object Model,对象组件模型)/DCOM(Distributed COM,分布式对象组件模型)和CORBA(Common Objec

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1