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

上传人:b****7 文档编号:9505484 上传时间:2023-02-05 格式:DOCX 页数:17 大小:300.35KB
下载 相关 举报
最新版课程设计报告534338.docx_第1页
第1页 / 共17页
最新版课程设计报告534338.docx_第2页
第2页 / 共17页
最新版课程设计报告534338.docx_第3页
第3页 / 共17页
最新版课程设计报告534338.docx_第4页
第4页 / 共17页
最新版课程设计报告534338.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

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

《最新版课程设计报告534338.docx》由会员分享,可在线阅读,更多相关《最新版课程设计报告534338.docx(17页珍藏版)》请在冰豆网上搜索。

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

最新版课程设计报告534338

 

分布式计算课程设计报告

——加减计算器

 

专业:

网络工程

班级:

11级

(1)班

指导老师:

曾文献

小组成员:

郝蕴

学号:

 

前言

分布式计算是近年提出的一种新的计算方式。

所谓分布式计算就是在两个或多个软件互相共享信息,这些软件既可以在同一台计算机上运行,也可以在通过网络连接起来的多台计算机上运行。

分布式计算比起其它算法具有以下几个优点:

1、稀有资源可以共享。

2、通过分布式计算可以在多台计算机上平衡计算负载。

3、可以把程序放在最适合运行它的计算机上。

其中,共享稀有资源和平衡负载是计算机分布式计算的核心思想之一。

分布式操作系统(松耦合硬件紧耦合软件)

单系统映像

1.单一的全局的进程间通讯

2.进程管理处处相同

3.分布式文件系统

4.相同的系统调用.(各机器上系统内核相同)

AmoebaMach等等

同步,事务,进程管理调度处理器的分配.分布式文件系统,分布式共享存储器.

分布式应用系统

网络操作系统(松耦合硬件松耦合软件)

高度自治

主流的分布式计算技术及规范:

多层计算模型。

中间件技术。

ORB。

CORBA、COM/DCOM

Java。

消息队列。

软件总线。

工作流(WFMC)。

分布式计算技术在软件开发中得到了广泛的应用,它使复杂的大型网络应用程序变得易于开发。

基于组件对象模型COM(ComponentObjectModel)和分布式组件对象模型DCOM(DistributedCOM)的组件技术是微软的分布式对象技术。

通过详细地分析基于COM/DCOM组件技术的分布式计算的基本原理,总结了开发COM/DCOM组件的基本方法和三层分布式应用程序的实现过程

COM组件是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。

在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。

由此带来的好处是多方面的:

可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块。

此次,我们做的是一个类似计算器的软件,完成加,减运算的功能。

其中用到了接口技术、DLL、IDL、MIDL编译器等技术。

分为INTERFACE、DLLINTERFACE、DLLUNK和USEDLL四个部分。

前言···················································································第1页

软件实现介绍···················································································第4页

接口技术····················································································第4页

DLL······················································································第9页

IDL······················································································第13页

MIDL编译器··················································································第15页

客户调用··················································································第19页

总结····················································································第22页

软件实现介绍:

1.接口技术:

⏹COM把接口与实现分离开的动机:

(1)升级.把对象内部的工作细节对客户隐藏起来。

使得实现类内部的数据成员的数量、类型以及内部的方法都可以发生变化,而客户程序无需重新编译。

客户在运行时询问对象,以便发现对象的扩展功能。

(是否实现了其他的接口?

(2)编译器独立性。

⏹COM规范规定:

接口是包含了一组函数的数据结构,通过这组数据结构,客户可以调用组件对象的功能。

接口的结构如下所示:

客户程序使用一个指向接口数据结构的指针来调用接口成员函数。

接口指针实际上指向第二个指针,这第二个指针指向一组函数指针(称为接口函数表,通常也成为虚函数表vtable,指向vtable的指针也成为虚表指针pvtable)虚表中每一项为一个4字节的函数指针,指向函数的实现。

接口及其接口方法的实现

COM接口只是描述了它所代表的功能.实现这些功能的是COM对象.COM规范并没有规定对象应该如何实现,只要接口指针能够访问到对象对接口的具体实现即可.

这里我们使用C++语言来实现COM对象.

当然,使用C++语言也有不同的方法来实现COM对象,只要通过接口指针能够访问到对象的的方法和属性(私有数据)即可。

这里首先我们使用从接口类派生实现类的办法来实现COM对象。

实际上,使用C++还有别的办法也能实现COM对象。

比如,MFC使用的嵌套类的办法,使用模板类的方法等等.

组件、对象与接口:

接口与实现类的内存结构:

代码实现:

#include"stdafx.h"

#include"objbase.h"

//接口定义

interfaceIMath

{

public:

virtualintAdd(intnAdd1,intnAdd2)=0;

virtualintSub(intnSub1,intnSub2)=0;

};

//接口的实现1

classCImpMath1:

publicIMath

{

public:

virtualintAdd(intnAdd1,intnAdd2);

virtualintSub(intnSub1,intnSub2);

};

intCImpMath1:

:

Add(intnAdd1,intnAdd2)

{

return(nAdd1+nAdd2);

}

intCImpMath1:

:

Sub(intnSub1,intnSub2)

{

return(nSub1-nSub2);

}

//接口的实现2

classCImpMath2:

publicIMath

{

public:

virtualintAdd(intnAdd1,intnAdd2);

virtualintSub(intnSub1,intnSub2);

};

intCImpMath2:

:

Add(intnAdd1,intnAdd2)

{

return(nAdd1+nAdd2);

}

intCImpMath2:

:

Sub(intnSub1,intnSub2)

{

return(nSub1-nSub2);

}

//创建接口

IMath*CreateInstance()

{

returnnewCImpMath2;

}

intmain(intargc,char*argv[])

{

IMath*piMath=CreateInstance();

intnAdd=piMath->Add(100,100);

return0;

2.DLL

在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件[1],放置于系统中。

当我们执行某一个程序时,相应的DLL文件就会被调用。

一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。

例如,在Windows操作系统中,Comdlg32DLL执行与对话框有关的常见函数。

因此,每个程序都可以使用该DLL中包含的功能来实现“打开”对话框。

这有助于促进代码重用和内存的有效使用。

通过使用DLL,程序可以实现模块化,由相对独立的组件组成。

例如,一个计帐程序可以按模块来销售。

可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。

因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。

此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。

例如,您可能具有一个工资计算程序,而税率每年都会更改。

当这些更改被隔离到DLL中以后,您无需重新生成或安装整个程序就可以应用更新。

DLL可以向外引出(export)变量或函数。

1.静态库(.lib)或.o

2.动态库(.dll)或.so

简化了项目的管理。

⏹节省内存。

(访问同一个DLL的进程代码页面共享)

⏹资源共享。

(图标等资源)

⏹多种语言编程

动态库的链接:

程序执行loadlibrary加载dll

1。

新建一个项目bcbcli,加入mangle.h头文件

2。

#include“mangle.h”

3。

typedefint(*MYFUN)(void);

MYFUNmyf;

HANDLEh=LoadLibrary("mangle.dll");

myf=(MYFUN)GetProcAddress(h,"myfun");

intres=(*myf)();//或res=myf();

4。

编译执行。

Dll的四个文件:

接口类的声明和实现,实现类的声明和实现,只有接口类的声明需要提供给客户。

代码:

#include"stdafx.h"

#include"math.h"

BOOLAPIENTRYDllMain(HANDLEhModule,

DWORDul_reason_for_call,

LPVOIDlpReserved

{

returnTRUE;

}

//接口的实现1

classCMath:

publicIMath

{

public:

CMath();

virtualintAddRef();

virtualintRelease();

virtualintAdd(intnAdd1,intnAdd2);

virtualintSub(intnSub1,intnSub2);

public:

LONGm_nRef;//引用计数

};

CMath:

:

CMath()

{

m_nRef=0;

}

intCMath:

:

AddRef()

{

InterlockedIncrement(&m_nRef);//增加引用计数

returnm_nRef;

}

intCMath:

:

Release()

{

InterlockedDecrement(&m_nRef);//减少引用计数

//如果为0,删除对象

if(m_nRef==0)

{

deletethis;

}

returnm_nRef;

}

intCMath:

:

Add(intnAdd1,intnAdd2)

{

return(nAdd1+nAdd2);

}

intCMath:

:

Sub(intnSub1,intnSub2)

{

return(nSub1-nSub2);

}

//创建接口

IMath*CreateInstance()

{

returnnewCMath;

}

3.IDL

COM最终的目标是建立二进制级的组件模型。

COM规范只定义了接口的特征,它没有规定编译器,也没有约束语言的使用。

我们不仅需要需要编译器独立性,还需要语言的独立性。

语言映射:

C++-》其他语言。

类似于为了解决链接器兼容性问题时为每一种可能的链接器都提供一个模块定义文件的方式一样,也可以把C++定义的接口翻译到其他的编程语言中。

因为COM接口的二进制本质上就是一组vptr/vtbl虚表指针和虚表,所以,很多语言都可以做到。

但如果为所有已知的语言对所有的接口都产生映射版本,工作量巨大。

由于C++语言非常复杂,并且很容易产生歧义,它所描述的接口不一定能映射到所有可能的语言上。

COM提供了这样一种语言,它只用到基本的C语法。

同时加入了一些能消除歧义的特征,用来描述接口。

称为接口定义语言IDL(InterfaceDefinitionLanguage)

⏹COMIDL以OSF(OpenSoftwareFoundation)开放软件基金会的DCERPC(DistributedComputingEnvironmentRPC)IDL为基础。

DCEIDL使得我们可以以语言无关的方式来描述远程调用,IDL编译器也能够产生相应的网络代码。

COMIDL在DCEIDL的基础上加入了一些与COM相关的扩展,比如继承性、多态性等。

⏹它的意义在于以语言中性的方式准确地描述接口的类型.并且在IDL与其他语言之间建立映射.从而作为客户端与服务器端的接口描述标准.使得各方在遵循IDL标准的基础上,自由地选择编程语言.

⏹IDL支持结构类型,并以结构类型作为参数。

⏹IDL支持指针类型,并使用C指针语法。

代码实现:

//DllUnk.cpp:

DefinestheentrypointfortheDLLapplication.

//

#include"stdafx.h"

#include"math.h"

BOOLAPIENTRYDllMain(HANDLEhModule,

DWORDul_reason_for_call,

LPVOIDlpReserved

{

returnTRUE;

}

4.MIDL编译器

⏹MIDL.exe是Win32SDK提供的工具。

实现从IDL到C/C++的映射.

dictionary.h接口说明的头文件(C/C++)

dictionary_p.c实现了接口的代理和存根

dictionary_i.c定义了IDL中的GUID、IID

dlldata.c代理存根的入口函数以及其他数据结构

(DllGetClassObject等函数)

dictionary.tlb类型库文件.可以供VBJava等编译器使用.

⏹开发工具提供了可视化编写IDL的工具,比如C++Builder的TypeLibEditor。

代码实现:

.h文件:

#ifndef_MATH_H_

#define_MATH_H_

#include"objbase.h"

//定义接口

interfaceIMath

{

public:

virtualintAddRef()=0;

virtualintRelease()=0;

virtualintAdd(intnAdd1,intnAdd2)=0;

virtualintSub(intnSub1,intnSub2)=0;

};

#endif//_MATH_H_

.h文件:

#ifndef_MATH_H_

#define_MATH_H_

#include"unknwn.h"

interfaceIMath:

IUnknown

{

public:

virtualintAdd(intnAdd1,intnAdd2)=0;

};

#endif//_MATH_H_

5.COM组件与客户程序的交互过程

6.用VC测试COM组件(客户调用)

代码实现:

#include"stdafx.h"

#include"../DllInterface/math.h"

typedefIMath*(*CREATEINSTANCE)();

IMath*CreateInterface()

{//加载动态库

HMODULEhDll=(HMODULE)

LoadLibrary("DllInterface.dll");

//获取创建接口的函数

CREATEINSTANCECreateInstance=

(CREATEINSTANCE)GetProcAddress(

hDll,"CreateInstance");

//创建接口

IMath*piMath=CreateInstance();

//返回接口

returnpiMath;

}

intmain(intargc,char*argv[])

{

//创建接口

IMath*piMath=CreateInterface();

//增加引用计数

piMath->AddRef();

//使用接口

intnAdd=piMath->Add(100,100);

printf("%d\n",nAdd);

//减少引用计数

piMath->Release();

return0;

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

总结

通过本次实验可以大体看出COM组件的工作原理。

虽然利用ATL,但还是可以看到COM服务器的主要结构。

在客户端使用COM服务器时,也是按照组件的创建过程。

先初始化,然后获得服务器组件的CLSID;再获取IUnknown指针,通过该接口成员的函数查找所需要的接口指针,这样就可以使用接口了。

课程设计的过程中,由于对理论掌握的不熟练,或者是操作过程中发生失误,都会导致最后结果出不来。

至善至美,是人类永恒的追求。

但是,不从忘却“金无足赤,人无完人”,我们换种思维方式,去恶亦是至善,改错亦为至美。

在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。

最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。

 

对我们网络工程专业的本科生来说,实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。

通过课程设计,让我们找出自身状况与实际需要的差距并在以后的学习期间及时补充相关知识,为求职与正式工作做好充分的知识、能力准备,从而缩短从校园走向社会的心理转型期。

 

通过课程设计,我更加明白了一个真理,“实践是检验真理的唯一标准”。

课程设计达到了专业学习的预期目的。

课程设计之后,我们普遍感到不仅实际动手能力有所提高,更重要的是通过对设计过程的了解,进一步激发了我们对专业知识的兴趣,并能结合实际存在的问题在专业领域内进行更深入的学习。

通过此次课程设计使我深刻了解到了日常知识积累的重要性。

书到用时方恨少,在以后的学习中一定要吸取经验,学好基础知识并努力开阔视野。

同时通过此次课程设计,对于设计可视化窗口的程序有了更好的了解,也激发了自己对可视化窗口程序设计的兴趣。

而且通过这次课程设计,使自己对课本上的东西有了更好的掌握,对课程内容的了解更加深刻,受益匪浅。

 

而且通过本次课程设计更加意识到提高编程能力关键是要多多实践,读书是为写代码打基础,但只读书不敲代码是不可能提高实际的编程能力的。

只有多读源码、多写代码、多思考才能对知识有更加深刻的了解。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 商业计划

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

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