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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

最新版课程设计报告534338.docx

1、最新版课程设计报告534338 分布式计算课程设计报告 加减计算器 专 业: 网络工程 班 级: 11级(1)班 指导老师: 曾文献 小组成员: 郝蕴 学号:前 言 分布式计算是近年提出的一种新的计算方式。所谓分布式计算就是在两个或多个软件互相共享信息,这些软件既可以在同一台计算机上运行,也可以在通过网络连接起来的多台计算机上运行。分布式计算比起其它算法具有以下几个优点:1、稀有资源可以共享。2、通过分布式计算可以在多台计算机上平衡计算负载。3、可以把程序放在最适合运行它的计算机上。其中,共享稀有资源和平衡负载是计算机分布式计算的核心思想之一。分布式操作系统 ( 松耦合硬件 紧耦合软件)单系统

2、映像1. 单一的全局的进程间通讯2. 进程管理处处相同3. 分布式文件系统4. 相同的系统调用.(各机器上系统内核相同) Amoeba Mach 等等 同步, 事务, 进程管理 调度 处理器的分配. 分布式文件系统, 分布式共享存储器.分布式应用系统 网络操作系统 ( 松耦合硬件 松耦合软件) 高度自治主流的分布式计算技术及规范:多层计算模型。中间件技术。ORB。CORBA、COM/DCOMJava。消息队列 。 软件总线。工作流(WFMC)。分布式计算技术在软件开发中得到了广泛的应用 ,它使复杂的大型网络应用程序变得易于开发。基于组件对象模型COM(ComponentObjectModel)

3、和分布式组件对象模型DCOM (DistributedCOM )的组件技术是微软的分布式对象技术。通过详细地分析基于COM/DCOM组件技术的分布式计算的基本原理 ,总结了开发COM /DCOM组件的基本方法和三层分布式应用程序的实现过程 COM组件是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境

4、下;COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块。 此次,我们做的是一个类似计算器的软件,完成加,减运算的功能。其中用到了接口技术、DLL、IDL、MIDL编译器等技术。分为INTERFACE、DLLINTERFACE、DLLUNK和USEDLL四个部分。前 言第1页软件实现介绍第4页 接口技术第4页 DLL第9页 IDL第13页 MIDL编译器第15页客户调用第19页总 结第22页 软件实现介绍: 1.接口技术: COM把接口与实现分离开的动机:(1)升级. 把对象内部的工作细节对客户隐藏起来。使得实现类内部的数据成员的数量、类型以及内部的方法都可以发生

5、变化,而客户程序无需重新编译。客户在运行时询问对象,以便发现对象的扩展功能。(是否实现了其他的接口?)(2)编译器独立性。 COM规范规定: 接口是包含了一组函数的数据结构,通过这组数据结构,客户可以调用组件对象的功能。接口的结构如下所示: 客户程序使用一个指向接口数据结构的指针来调用接口成员函数。接口指针实际上指向第二个指针,这第二个指针指向一组函数指针(称为接口函数表,通常也成为虚函数表vtable,指向vtable的指针也成为虚表指针pvtable)虚表中每一项为一个4字节的函数指针,指向函数的实现。接口及其接口方法的实现COM接口只是描述了它所代表的功能.实现这些功能的是COM对象.C

6、OM规范并没有规定对象应该如何实现,只要接口指针能够访问到对象对接口的具体实现即可.这里我们使用C+语言来实现COM对象. 当然,使用C+语言也有不同的方法来实现COM对象,只要通过接口指针能够访问到对象的的方法和属性(私有数据)即可。这里首先我们使用从接口类派生实现类的办法来实现COM对象。实际上,使用C+还有别的办法也能实现COM对象。比如,MFC使用的嵌套类的办法,使用模板类的方法等等.组件、对象与接口:接口与实现类的内存结构 : 代码实现:#include stdafx.h#include objbase.h/接口定义interface IMathpublic: virtual int

7、 Add( int nAdd1, int nAdd2 ) = 0; virtual int Sub( int nSub1, int nSub2 ) = 0;/接口的实现1class CImpMath1 : public IMathpublic: virtual int Add( int nAdd1, int nAdd2 ); virtual int Sub( int nSub1, int nSub2 );int CImpMath1:Add( int nAdd1, int nAdd2 ) return ( nAdd1 + nAdd2 );int CImpMath1:Sub( int nSub1,

8、 int nSub2 ) return ( nSub1 - nSub2 );/接口的实现2class CImpMath2 : public IMathpublic: virtual int Add( int nAdd1, int nAdd2 ); virtual int Sub( int nSub1, int nSub2 );int CImpMath2:Add( int nAdd1, int nAdd2 ) return ( nAdd1 + nAdd2 );int CImpMath2:Sub( int nSub1, int nSub2 ) return ( nSub1 - nSub2 );/创

9、建接口IMath * CreateInstance( ) return new CImpMath2;int main(int argc, char* argv) IMath * piMath = CreateInstance( ); int nAdd = piMath-Add( 100, 100 ); return 0;2.DLL在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件1,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文

10、件被称为共享DLL文件。例如,在 Windows操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数。因此,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于促进代码重用和内存的有效使用。通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计帐程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您可能具有一个工资计算程序,而税率每年都会更改。当这些更改被隔

11、离到 DLL 中以后,您无需重新生成或安装整个程序就可以应用更新。 DLL可以向外引出(export)变量或函数。1.静态库 (.lib) 或.o2.动态库 (.dll) 或.so 简化了项目的管理。 节省内存。(访问同一个DLL的进程代码页面共享) 资源共享。(图标等资源) 多种语言编程动态库的链接:程序执行loadlibrary加载dll 1。 新建一个项目bcbcli,加入mangle.h头文件 2。include “mangle.h” 3。typedef int ( * MYFUN)(void); MYFUN myf; HANDLE h=LoadLibrary(mangle.dll);

12、 myf=(MYFUN)GetProcAddress(h,myfun); int res=(*myf)(); /或res=myf(); 4。编译执行。Dll的四个文件:接口类的声明和实现,实现类的声明和实现,只有接口类的声明需要提供给客户。代码:#include stdafx.h#include math.hBOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) return TRUE;/接口的实现1class CMath : public IMathpublic: CMath(

13、); virtual int AddRef( ); virtual int Release( ); virtual int Add( int nAdd1, int nAdd2 ); virtual int Sub( int nSub1, int nSub2 );public: LONG m_nRef; /引用计数;CMath:CMath( ) m_nRef = 0;int CMath:AddRef( ) InterlockedIncrement( &m_nRef ); /增加引用计数 return m_nRef;int CMath:Release( ) InterlockedDecrement

14、( &m_nRef ); /减少引用计数 /如果为0,删除对象 if( m_nRef = 0 ) delete this; return m_nRef;int CMath:Add( int nAdd1, int nAdd2 ) return ( nAdd1 + nAdd2 );int CMath:Sub( int nSub1, int nSub2 ) return ( nSub1 - nSub2 );/创建接口IMath * CreateInstance( ) return new CMath;3.IDL COM最终的目标是建立二进制级的组件模型。COM规范只定义了接口的特征,它没有规定编译器

15、,也没有约束语言的使用。我们不仅需要需要编译器独立性, 还需要语言的独立性。语言映射:C其他语言。 类似于为了解决链接器兼容性问题时为每一种可能的链接器都提供一个模块定义文件的方式一样,也可以把C定义的接口翻译到其他的编程语言中。因为COM接口的二进制本质上就是一组vptr/vtbl虚表指针和虚表,所以,很多语言都可以做到。但如果为所有已知的语言对所有的接口都产生映射版本,工作量巨大。由于C语言非常复杂,并且很容易产生歧义,它所描述的接口不一定能映射到所有可能的语言上。COM提供了这样一种语言,它只用到基本的C语法。同时加入了一些能消除歧义的特征,用来描述接口。称为接口定义语言IDL(Inte

16、rface Definition Language) COM IDL以OSF(OpenSoftware Foundation)开放软件基金会的DCE RPC(Distributed Computing Environment RPC)IDL为基础。DCE IDL使得我们可以以语言无关的方式来描述远程调用, IDL编译器也能够产生相应的网络代码。 COM IDL在DCE IDL的基础上加入了一些与COM相关的扩展,比如继承性、多态性等。 它的意义在于以语言中性的方式准确地描述接口的类型. 并且在IDL与其他语言之间建立映射. 从而作为客户端与服务器端的接口描述标准. 使得各方在遵循IDL标准的基

17、础上,自由地选择编程语言. IDL支持结构类型,并以结构类型作为参数。 IDL支持指针类型,并使用C指针语法。代码实现:/ DllUnk.cpp : Defines the entry point for the DLL application./#include stdafx.h#include math.hBOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) return TRUE;4.MIDL编译器 MIDL.exe是Win32SDK提供的工具。实现从IDL到C/C+的映射

18、. dictionary.h 接口说明的头文件 (C/C+) dictionary_p.c 实现了接口的代理和存根 dictionary_i.c 定义了IDL中的GUID、IID dlldata.c 代理存根的入口函数以及其他数据结构 (DllGetClassObject等函数) dictionary.tlb 类型库文件.可以供VB Java等编译器使用. 开发工具提供了可视化编写IDL的工具,比如CBuilder的TypeLibEditor。 代码实现: .h文件:#ifndef _MATH_H_#define _MATH_H_#include objbase.h/定义接口interface

19、 IMathpublic: virtual int AddRef( ) = 0; virtual int Release( ) = 0; virtual int Add( int nAdd1, int nAdd2 ) = 0; virtual int Sub( int nSub1, int nSub2 ) = 0;#endif /_MATH_H_.h文件:#ifndef _MATH_H_#define _MATH_H_#include unknwn.hinterface IMath : IUnknownpublic: virtual int Add( int nAdd1, int nAdd2

20、) = 0;#endif / _MATH_H_5. COM组件与客户程序的交互过程6.用VC测试COM组件(客户调用)代码实现:#include stdafx.h#include ./DllInterface/math.htypedef IMath * ( * CREATEINSTANCE)( );IMath * CreateInterface( ) /加载动态库 HMODULE hDll = ( HMODULE ) LoadLibrary( DllInterface.dll ); /获取创建接口的函数 CREATEINSTANCE CreateInstance = (CREATEINSTAN

21、CE)GetProcAddress( hDll, CreateInstance ); /创建接口 IMath * piMath = CreateInstance( ); /返回接口 return piMath;int main(int argc, char* argv) /创建接口 IMath * piMath = CreateInterface( ); /增加引用计数 piMath-AddRef( ); /使用接口 int nAdd = piMath-Add( 100, 100 ); printf( %dn, nAdd ); /减少引用计数 piMath-Release( ); return

22、 0;在接口的实现部分只暴露了一个接口函数CreateInterface,在组件、接口、调用部分都存在CreateInterface这个函数,他们都是通过CreateInterface来实现它们信息的传递,在DLL中创建接口IMath * CreateInstance( ),等待接口类的调用,而在接口IMath * CreateInstance( )中,在函数调用部分使用typedef,代码中的typedef IMath * ( * CREATEINSTANCE)( ),在通过IMath * piMath = CreateInterface( );,让其通过 piMath来实现调用。总 结通过

23、本次实验可以大体看出COM组件的工作原理。虽然利用ATL,但还是可以看到COM服务器的主要结构。在客户端使用COM服务器时,也是按照组件的创建过程。先初始化,然后获得服务器组件的CLSID;再获取IUnknown指针,通过该接口成员的函数查找所需要的接口指针,这样就可以使用接口了。课程设计的过程中,由于对理论掌握的不熟练,或者是操作过程中发生失误,都会导致最后结果出不来。至善至美,是人类永恒的追求。但是,不从忘却“金无足赤,人无完人”,我们换种思维方式,去恶亦是至善,改错亦为至美。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善

24、莫大焉”的知行观。对我们网络工程专业的本科生来说,实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。通过课程设计,让我们找出自身状况与实际需要的差距并在以后的学习期间及时补充相关知识,为求职与正式工作做好充分的知识、能力准备,从而缩短从校园走向社会的心理转型期。通过课程设计,我更加明白了一个真理,“实践是检验真理的唯一标准”。课程设计达到了专业学习的预期目的。课程设计之后,我们普遍感到不仅实际动手能力有所提高,更重要的是通过对设计过程的了解,进一步激发了我们对专业知识的兴趣,并能结合实际存在的问题在专业领域内进行更深入的学习。通过此次课程设计使我深刻了解到了日常知识积累的重要性。书到用时方恨少,在以后的学习中一定要吸取经验,学好基础知识并努力开阔视野。同时通过此次课程设计,对于设计可视化窗口的程序有了更好的了解,也激发了自己对可视化窗口程序设计的兴趣。而且通过这次课程设计,使自己对课本上的东西有了更好的掌握,对课程内容的了解更加深刻,受益匪浅。而且通过本次课程设计更加意识到提高编程能力关键是要多多实践,读书是为写代码打基础,但只读书不敲代码是不可能提高实际的编程能力的。只有多读源码、多写代码、多思考才能对知识有更加深刻的了解。

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

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