收藏 分享(赏)

分布式实验报告-张莹-2011127129.docx

上传人:HR专家 文档编号:5026294 上传时间:2019-01-31 格式:DOCX 页数:35 大小:3.95MB
下载 相关 举报
分布式实验报告-张莹-2011127129.docx_第1页
第1页 / 共35页
分布式实验报告-张莹-2011127129.docx_第2页
第2页 / 共35页
分布式实验报告-张莹-2011127129.docx_第3页
第3页 / 共35页
分布式实验报告-张莹-2011127129.docx_第4页
第4页 / 共35页
分布式实验报告-张莹-2011127129.docx_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、学号 2011127129 姓名:张莹 分布式实验报告1实验:仿真组件对象目录实验目的 1实验内容 1实验环境 2实验要求 3实验步骤 4软件下载 4实验过程 5实验心得 35实验目的1. 学习掌握开发编译器中性、可维护、可升级的组件对象的基本原理、基本方法;2. 学习分别使用异种编译器开发组件的服务器端和客户端。实验内容使用 VC 开发一个以 DLL 作为载体的仿真 COM 对象, 此对象支持多个接口.每个接口支持不同的功能. 使用 BC 开发一个客户,创建此仿真 COM 对象,并调用它的不同接口的功能. 要求在试验过程中主要完成如下工作:1. 验证名字改编造成的编译器依赖性.2. 验证头文

2、件的改变带来的 DLL 升级的问题.3. 验证接口类带来的升级便利.4. 验证普通析构函数带来的编译器依赖性5. 验证普通析构函数带来的内存泄漏.6. 验证虚拟析构函数带来的编译器依赖性.7. 验证 RTTI 的编译器依赖性.8. 验证引用计数带来的客户端的便利.学号 2011127129 姓名:张莹 分布式实验报告2实验环境1 Windows7 专业版2 Microsoft Visual Studio3 Borland C+ Builder 6学号 2011127129 姓名:张莹 分布式实验报告3实验要求1 自行拟定组件的业务功能,但应与讲义中例程不同。2 逐步完善其结构,记录下在此过程中

3、客户端的症状。 (比如以屏幕截屏的方式)3 分析原因, 提出解决方法4 记录试验过程,以及主要源代码5 撰写实验报告.学号 2011127129 姓名:张莹 分布式实验报告4实验步骤1 使用 VC 建立一个 DLL,输出一个类。在 VC 客户端使用此类。2 验证 bc 的客户端无法使用此类3 以避免名字改编的方式输出一个函数以代替构造函数。4 验证功能函数被名字改编导致无法链接5 将功能函数改为虚函数并验证虚函数可以顺利调用6 验证虚析构函数的编译器依赖性7 以虚功能函数的方式来完成对象的释放工作8 验证数据成员的存在导致升级困难。9 验证参数入栈方向不一致所导致的错误10 从实现类中分离出接

4、口类。客户端只与接口类交互。11 接口类使用普通析构函数。验证同种编译器产生的客户端会出现内存泄漏,验证异种编译器所产生的客户端无法链接。12 接口类使用虚析构函数,验证同种编译器产生的客户端内存泄漏消失,验证异种编译器所产生的客户端仍然无法链接。13 接口类进行改造,以纯虚函数的方式提供释放对象的功能。14 验证接口类不变时,实现类可以进行任意的更新,而客户端可以无缝升级。15 验证接口类的变化带来升级的困难。16 使用多接口的方式对对象进行扩展,验证在同种编译器的客户端可以顺利升级。17 验证以上情形在异种客户端无法链接。18 以功能函数的方式编译器中性地实现接口转换,验证异种编译器方式下

5、也可顺利升级。19 验证一个对象的多个接口之间的紧密耦合性。20 以引用计数的方式消除多接口的紧密耦合性。软件下载http:/ 虚拟光驱http:/ C+ builderhttp:/ vs2012学号 2011127129 姓名:张莹 分布式实验报告5实验过程1、打开 visual studio,选择 visual C+开发设置。然后点击“启动” 。使用 vc 建立一个 dll FastStringDll Win32,名称为 FastStringDll Win32 控制台应用程序 DLL 导出符号。学号 2011127129 姓名:张莹 分布式实验报告6运行一下,可以成功。学号 2011127

6、129 姓名:张莹 分布式实验报告7添加类 FastString 右键点击项目 添加 类 C+类 输入类名 FastString 完成学号 2011127129 姓名:张莹 分布式实验报告8输入代码学号 2011127129 姓名:张莹 分布式实验报告9代码如下产生头文件:FastString.hclass _declspec(dllexport) FastString char * m_psz;public:FastString( char*psz);FastString(void);int Length(void);int Find( char*psz);新增实现文件:FastString

7、.cpp#include “stdafx.h“ / 预编译#include “FastString.h“#includeFastString:FastString( char* psz):m_psz(new charstrlen(psz)+1)strcpy_s(m_psz,strlen(psz)+1,psz); /分配内存学号 2011127129 姓名:张莹 分布式实验报告10FastString:FastString(void) delete m_psz; /释放内存int FastString:Length(void) return strlen(m_psz); /计算长度int Fas

8、tString:Find( char*psz)return 0; /省略, 这不是我们讨论的重点.选择 release,再运行一下。这时就生成了 dll 文件学号 2011127129 姓名:张莹 分布式实验报告112、在解决方案下添加一个客户端 ,使用 vc 客户端调用此类 建立 vc 控制台程序 VCClient 设定项目属性-配置属性: C/C+-常规:附加包含目录:编辑:新行:$(SolutionDir)FastStringDll 这里路径要引对,要引入 dll 文件。D:comFastStringDllReleaseD:comFastStringDllFastStringDll 链接

9、器-常规:附加库目录:编辑:新行: $(SolutionDir)$(Configuration) 链接器-输入:附加依赖项:编辑加入: FastStringDll.lib 代码VCClient.cpp#include “stdafx.h“#include #include “FastString.h“using namespace std;int _tmain(int argc, _TCHAR* argv)FastString *pFS=new FastString(“fdfd“);int res=pFS-Length ();coutLength() ; / 提示链接出错。5. 把 Lengt

10、h 和 Find 改为虚函数。以上链接通过。6. BC 的运行过程。 IDE 下运行无结果。 直接运行提示出错:找不到 DLL Project options-C+(Shared Options)- 将 Final output 设定为 Dll 所在位置 : /Debug 代码:学号 2011127129 姓名:张莹 分布式实验报告20FastString *pFS=CreateObject(“ffdfd“);int len= pFS-Length();ShowMessage(AnsiString( len);7. Length 或者 Find 的执行情况:执行结果不正确,将其改为_stdca

11、ll 执行结果正常8. 此时可以取消对类的输出。即服务器端删除掉 _declspec(dllexport) 学号 2011127129 姓名:张莹 分布式实验报告21Bc 客户仍可正常执行。9. 对数据的敏感性:客户编译器与服务器编译器同时依赖于同一个 c+类定义, 在类的定义部分:加上:Public:int a;int b;构造函数中:a=2;b=5;以此文件生成 dll,客户端输出:ShowMessage(AnsiString(pFS-a );ShowMessage(AnsiString( pFS-b );以此文件生成客户。得到版本 1.改变 a,b 的定义顺序。生成 dll和客户。得到版

12、本 2.打乱客户和 dll的搭配关系。A 和 b的值都将颠倒。实际上是一个显示的交叉转换过程。学号 2011127129 姓名:张莹 分布式实验报告2210. 于函数也有如上特性对虚拟函数的敏感性:定义两个虚函数:virtual int fa();virtual int fb();分别实现之。编译服务器端和客户端。得到版本1.改变定义顺序:virtual int fb(); virtual int fa();编译服务器端和客户端。得到版本2.打乱版本的搭配顺序,调用将出现错乱。学号 2011127129 姓名:张莹 分布式实验报告2311. 对普通函数的不敏感性:这里客户要用同种编译器,即 v

13、c对于以上的虚函数,改为非虚的。打乱次序后,调用不会出错。说明是通过名字解析的方式进行的。12. 所以要对接口进行抽象。降低耦合性。添加接口类:IFastString学号 2011127129 姓名:张莹 分布式实验报告24头文件:class IFastStringpublic:virtual int _stdcall Length(void)=0;virtual int _stdcall Find( char*psz)=0;IFastString();IFastString();学号 2011127129 姓名:张莹 分布式实验报告25;实现文件:#include “stdafx.h“#in

14、clude “IFastString.h“IFastString:IFastString(void)IFastString:IFastString(void)学号 2011127129 姓名:张莹 分布式实验报告26实现类 FastString.h 中:#include “IFastString.h“class FastString :public IFastString CreateObject的返回值改为 IFastString其声明:extern “C“ _declspec(dllexport) IFastString* CreateObject(char *psz); 放到接口头文件中

15、。客户端代码改为:#include “IFastString.h“IFastString *pFS=CreateObject(“fddfd“);学号 2011127129 姓名:张莹 分布式实验报告2713. 因为接口中已经没有数据,所以自然不存在数据的敏感性。14. 在 vc 客户端,使用 delete 进行内存释放:验证普通析构函数会出现内存泄漏。验证方法: 接口类重新向外输出_declspec(dllexport) 子类分配大量内存。IFastString *pFS=CreateObject(“fdfd“);int res=pFS-Length (); delete pFS;bool b

16、= _CrtDumpMemoryLeaks(); / 监控函数coutLength();delete pFS;析构函数位置不同而产生链接失败。学号 2011127129 姓名:张莹 分布式实验报告3017. 接口改为如下形式: 取消输出 增加 Delete 虚函数。 采用默认的构造和析构函数。class IFastStringpublic: 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);

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

当前位置:首页 > 实用文档 > 工作总结

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报