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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

分布式实验报告张莹127129.docx

1、分布式实验报告张莹127129实验:仿真组件对象实验目的1.学习掌握开发编译器中性、可维护、可升级的组件对象的基本原理、基本方法;2.学习分别使用异种编译器开发组件的服务器端和客户端。实验内容使用VC开发一个以DLL作为载体的仿真COM对象, 此对象支持多个接口.每个接口支持不同的功能. 使用BC开发一个客户,创建此仿真COM对象,并调用它的不同接口的功能. 要求在试验过程中主要完成如下工作:1.验证名字改编造成的编译器依赖性.2.验证头文件的改变带来的DLL升级的问题.3.验证接口类带来的升级便利.4.验证普通析构函数带来的编译器依赖性.5.验证普通析构函数带来的内存泄漏.6.验证虚拟析构函

2、数带来的编译器依赖性.7.验证RTTI的编译器依赖性.8.验证引用计数带来的客户端的便利.实验环境1Windows7 专业版2Microsoft Visual Studio3Borland C+ Builder 6实验要求1自行拟定组件的业务功能,但应与讲义中例程不同。2逐步完善其结构,记录下在此过程中客户端的症状。(比如以屏幕截屏的方式)3分析原因, 提出解决方法4记录试验过程,以及主要源代码5撰写实验报告.实验步骤1使用VC建立一个DLL,输出一个类。在VC客户端使用此类。2验证bc的客户端无法使用此类3以避免名字改编的方式输出一个函数以代替构造函数。4验证功能函数被名字改编导致无法链接5

3、将功能函数改为虚函数并验证虚函数可以顺利调用6验证虚析构函数的编译器依赖性7以虚功能函数的方式来完成对象的释放工作8验证数据成员的存在导致升级困难。9验证参数入栈方向不一致所导致的错误10从实现类中分离出接口类。客户端只与接口类交互。11接口类使用普通析构函数。验证同种编译器产生的客户端会出现内存泄漏,验证异种编译器所产生的客户端无法链接。12接口类使用虚析构函数,验证同种编译器产生的客户端内存泄漏消失,验证异种编译器所产生的客户端仍然无法链接。13接口类进行改造,以纯虚函数的方式提供释放对象的功能。14验证接口类不变时,实现类可以进行任意的更新,而客户端可以无缝升级。15验证接口类的变化带来

4、升级的困难。16使用多接口的方式对对象进行扩展,验证在同种编译器的客户端可以顺利升级。17验证以上情形在异种客户端无法链接。18以功能函数的方式编译器中性地实现接口转换,验证异种编译器方式下也可顺利升级。19验证一个对象的多个接口之间的紧密耦合性。20以引用计数的方式消除多接口的紧密耦合性。软件下载 虚拟光驱 C+ builder vs2012实验过程1、打开visual studio,选择visual C+开发设置。然后点击“启动”。使用vc建立一个dll FastStringDllWin32,名称为FastStringDllWin32 控制台应用程序DLL导出符号。运行一下,可以成功。添加

5、类FastString右键点击项目添加类C+类输入类名FastString完成输入代码代码如下产生头文件:FastString.hclass _declspec(dllexport) FastString char * m_psz;public: FastString( char*psz); FastString(void); int Length(void); int Find( char*psz);新增实现文件:FastString.cpp#include stdafx.h / 预编译#include FastString.h#includeFastString:FastString( c

6、har* psz):m_psz(new charstrlen(psz)+1)strcpy_s(m_psz,strlen(psz)+1,psz); /分配内存FastString:FastString(void) delete m_psz; /释放内存int FastString:Length(void) return strlen(m_psz); /计算长度int FastString:Find( char*psz)return 0; /省略, 这不是我们讨论的重点.选择release,再运行一下。这时就生成了dll文件2、在解决方案下添加一个客户端 ,使用vc客户端调用此类建立vc 控制台程

7、序 VCClient设定项目属性-配置属性:C/C+-常规:附加包含目录:编辑:新行:$(SolutionDir)FastStringDll 这里路径要引对,要引入dll文件。D:comFastStringDllReleaseD:comFastStringDllFastStringDll链接器-常规:附加库目录:编辑:新行:$(SolutionDir)$(Configuration)链接器-输入:附加依赖项:编辑加入:FastStringDll.lib代码VCClient.cpp#include stdafx.h#include #include FastString.husing names

8、pace std;int _tmain(int argc, _TCHAR* argv) FastString *pFS=new FastString(fdfd); int res=pFS-Length (); coutresLength() ; / 提示链接出错。5.把Length 和 Find 改为虚函数。以上链接通过。6.BC的运行过程。IDE下运行无结果。直接运行提示出错:找不到DLLProject options-C+(Shared Options)- 将 Final output 设定为 Dll 所在位置 : ./Debug代码:FastString *pFS=CreateObjec

9、t(ffdfd);int len= pFS-Length();ShowMessage(AnsiString( len);7.Length 或者 Find 的执行情况:执行结果不正确,将其改为_stdcall 执行结果正常8.此时可以取消对类的输出。即服务器端删除掉 _declspec(dllexport) Bc客户仍可正常执行。9.对数据的敏感性: 客户编译器与服务器编译器同时依赖于同一个c+类定义, 在类的定义部分:加上: Public: int a; int b; 构造函数中: a=2; b=5; 以此文件生成dll, 客户端输出:ShowMessage(AnsiString(pFS-a

10、); ShowMessage(AnsiString( pFS-b );以此文件生成客户。得到版本1.改变a,b的定义顺序。生成dll和客户。得到版本2.打乱客户和dll的搭配关系。A和b的值都将颠倒。实际上是一个显示的交叉转换过程。10.于函数也有如上特性对虚拟函数的敏感性:定义两个虚函数:virtual int fa(); virtual int fb(); 分别实现之。 编译服务器端和客户端。得到版本1. 改变定义顺序: virtual int fb(); virtual int fa();编译服务器端和客户端。得到版本2.打乱版本的搭配顺序,调用将出现错乱。11.对普通函数的不敏感性:这

11、里客户要用同种编译器,即vc对于以上的虚函数,改为非虚的。打乱次序后,调用不会出错。说明是通过名字解析的方式进行的。12.所以要对接口进行抽象。降低耦合性。添加接口类:IFastString头文件: class IFastString public: virtual int _stdcall Length(void)=0; virtual int _stdcall Find( char*psz)=0; IFastString(); IFastString(); ;实现文件:#include stdafx.h#include IFastString.hIFastString:IFastStrin

12、g(void)IFastString:IFastString(void)实现类FastString.h 中:#include IFastString.hclass FastString :public IFastString CreateObject的返回值改为IFastString其声明:extern C _declspec(dllexport) IFastString* CreateObject(char *psz); 放到接口头文件中。客户端代码改为:#include IFastString.hIFastString *pFS=CreateObject(fddfd);13.因为接口中已经

13、没有数据,所以自然不存在数据的敏感性。14.在vc客户端,使用delete 进行内存释放:验证普通析构函数会出现内存泄漏。验证方法:接口类重新向外输出_declspec(dllexport)子类分配大量内存。 IFastString *pFS=CreateObject(fdfd); int res=pFS-Length (); delete pFS; bool b= _CrtDumpMemoryLeaks(); / 监控函数 coutbLength(); delete pFS;析构函数位置不同而产生链接失败。17.接口改为如下形式:取消输出增加Delete 虚函数。采用默认的构造和析构函数。c

14、lass IFastString public: virtual void _stdcall Delete()=0; virtual int _stdcall Length(void)=0; virtual int _stdcall Find( char*psz)=0; ;delete的实现: void FastString:Delete () delete this; 18. BC 客户端改为: IFastString *pIFS= CreateObject(fdfd); int res=pIFS-Length() ; ShowMessage(AnsiString(res); pIFS-De

15、lete() ;通过。19.对接口进行改变 class IFastString public: virtual void _stdcall Delete()=0; virtual int _stdcall Length(void)=0; virtual int _stdcall Find( char*psz)=0; virtual int _stdcall FindN( char*psz,int n)=0; ;FastString 实现新函数。客户端对其进行调用。生成版本2.打乱版本1和2搭配次序。老客户用新对象,正常。新客户用老对象,失败。20.增加新的接口: class IPO publi

16、c: virtual void _stdcall Delete()=0; virtual void _stdcall Save()=0; ;多重继承:class FastString:public IFastString,public IPO 客户端: IPO *pIPO= dynamic_cast(pIFS);验证VC在接口之间可以正常运行。IFastString *pIFS=CreateObject(fdfd); int res=pIFS-Length (); IPO *pIPO= dynamic_cast(pIFS); pIPO-Save(); delete pIFS;BC 客户端运行异

17、常21.中性的类型转换接口改为如下形式:增加dynamic 函数。class IEO public: virtual void _stdcall Dynamic(char* name,void* ppI)=0; virtual void _stdcall Delete()=0; ;class IFastString:public IEO public: virtual int _stdcall Length(void)=0; virtual int _stdcall Find( char*psz)=0; ;class IPO:public IEO public: virtual void _s

18、tdcall Save()=0; ;class FastString:public IFastString,public IPO实现方式:void FastString:Dynamic(char *name,void*ppI) if(strcmp(name,IFastString)=0) *ppI=(IFastString*)this; else if(strcmp(name,IPO)=0) *ppI=(IPO*)this; else if(strcmp(name,IEO)=0) *ppI=(IPO*)this; 调用方式: IPO *pIPO; IEO * pIEO; pIFS-Dynami

19、c (IPO,(void*)&pIPO); pIPO-Dynamic (IEO,(void*)&pIEO);22.验证多接口之间的紧密耦合性。略。23.引用计数。改写接口,为以上对象添加引用计数功能实验心得上机课有些手忙脚乱,安装软件时也遇到各种未知问题但一切都井然有序地进行着。做实验最大的难题,是需要先弄懂一个关键,WHY为什么我们要做这个实验,即这个实验的目的是什么。弄通目标之后,接下来的实验就进行得轻松愉快了。最重要的一句话“因为跨平台,所以VC和BC下引用DLL的效果可能不一样。”XX,也让我们的实验显得容易很多。善于使用搜索引擎也是益处多多的。比如搜索一下“C+ Builder的开发指南”,就会发现很多跨平台的例子。这个会大大帮助我们理解实验,使实验顺利地进行下去。实验报告毕竟是份文档,如果能把实验者自己的想法、截图的方式和报告的书写,沉淀为更加规范的格式,那想必是份完美的文档。分布式不是一门很好理解的课程,但老师能从上课、完美翻译的参考书、实验、作业等一系列方式让我们多方位地理解这门课,我们是受益匪浅的。最后,感谢老师辛苦的授课!

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

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