




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、学号2011127129姓名:张莹分布式实验报告实验:仿真组件对象目录实验目的1实验内容1实验环境2实验要求3实验步骤4软件下载4实验过程5实验心得35实验目的1. 学习掌握开发编译器中性、可维护、可升级的组件对象的基本原理、基本方法;2. 学习分别使用异种编译器开发组件的服务器端和客户端。实验内容使用VC开发一个以DLL作为载体的仿真COM对象, 此对象支持多个接口.每个接口支持不同的功能. 使用BC开发一个客户,创建此仿真COM对象,并调用它的不同接口的功能. 要求在试验过程中主要完成如下工作:1. 验证名字改编造成的编译器依赖性.2. 验证头文件的改变带来的DLL升级的问题.3. 验证接
2、口类带来的升级便利.4. 验证普通析构函数带来的编译器依赖性.5. 验证普通析构函数带来的内存泄漏.6. 验证虚拟析构函数带来的编译器依赖性.7. 验证RTTI的编译器依赖性.8. 验证引用计数带来的客户端的便利.实验环境1 Windows7 专业版2 Microsoft Visual Studio3 Borland C+ Builder 6实验要求1 自行拟定组件的业务功能,但应与讲义中例程不同。2 逐步完善其结构,记录下在此过程中客户端的症状。(比如以屏幕截屏的方式)3 分析原因, 提出解决方法4 记录试验过程,以及主要源代码5 撰写实验报告.实验步骤1 使用VC建立一个DLL,输出一个类
3、。在VC客户端使用此类。2 验证bc的客户端无法使用此类3 以避免名字改编的方式输出一个函数以代替构造函数。4 验证功能函数被名字改编导致无法链接5 将功能函数改为虚函数并验证虚函数可以顺利调用6 验证虚析构函数的编译器依赖性7 以虚功能函数的方式来完成对象的释放工作8 验证数据成员的存在导致升级困难。9 验证参数入栈方向不一致所导致的错误10 从实现类中分离出接口类。客户端只与接口类交互。11 接口类使用普通析构函数。验证同种编译器产生的客户端会出现内存泄漏,验证异种编译器所产生的客户端无法链接。12 接口类使用虚析构函数,验证同种编译器产生的客户端内存泄漏消失,验证异种编译器所产生的客户端
4、仍然无法链接。13 接口类进行改造,以纯虚函数的方式提供释放对象的功能。14 验证接口类不变时,实现类可以进行任意的更新,而客户端可以无缝升级。15 验证接口类的变化带来升级的困难。16 使用多接口的方式对对象进行扩展,验证在同种编译器的客户端可以顺利升级。17 验证以上情形在异种客户端无法链接。18 以功能函数的方式编译器中性地实现接口转换,验证异种编译器方式下也可顺利升级。19 验证一个对象的多个接口之间的紧密耦合性。20 以引用计数的方式消除多接口的紧密耦合性。软件下载 虚拟光驱 C+ builder vs2012实验过程1、打开visual studio,选择visual C+开发设置
5、。然后点击“启动”。使用vc建立一个dll FastStringDlll Win32,名称为FastStringDlll Win32 控制台应用程序l DLLl 导出符号。运行一下,可以成功。添加类FastStringl 右键点击项目l 添加l 类l C+类l 输入类名FastStringl 完成输入代码代码如下产生头文件:FastString.hclass _declspec(dllexport) FastStringchar * m_psz;public:FastString( char*psz);FastString(void);int Length(void);int Find( ch
6、ar*psz);新增实现文件:FastString.cpp#include "stdafx.h" / 预编译#include "FastString.h"#include<string.h>FastString:FastString( char* 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) re
7、turn strlen(m_psz); /计算长度int FastString:Find( char*psz)return 0; /省略, 这不是我们讨论的重点.选择release,再运行一下。这时就生成了dll文件2、在解决方案下添加一个客户端 ,使用vc客户端调用此类l 建立vc 控制台程序 VCClientl 设定项目属性-配置属性:l C/C+-常规:附加包含目录:编辑:新行:$(SolutionDir)FastStringDll 这里路径要引对,要引入dll文件。D:comFastStringDllReleaseD:comFastStringDllFastStringDlll 链接器
8、-常规:附加库目录:编辑:新行:$(SolutionDir)$(Configuration)l 链接器-输入:附加依赖项:编辑加入:FastStringDll.libl 代码VCClient.cpp#include "stdafx.h"#include <iostream>#include "FastString.h"using namespace std;int _tmain(int argc, _TCHAR* argv) FastString *pFS=new FastString("fdfd"); int res=p
9、FS->Length (); cout<<res<<endl; return 0;l 设定VCClient 为启动项目运行成功。3. 使用BC创建一个客户端 BCClientl 打开bc 创建一个VCL Forms Application应用程序。l 在VC的解决方案文件夹下新建文件夹筛选器BCClient。l 在BCClient内对BC项目全部保存起来,再导入到VCClient里面l 在BC窗口界面点一下button,再点一下视图,就能添加一个按钮了。这里产生点击click处理事件。l 在Unit1.cpp中,#include "Unit1.h&quo
10、t; 后面加入#include "FastString.h"l 运行,发现bcc32 Error Unit1.cpp(7): E2209 Unable to open include file 'FastString.h' l 设定包含路径:Project- Options C+ Compiler Directories & conditional include file search path 加上 ./FastStringDllVS2012是在属性-配置属性-VC+目录-包含目录l 编译通过l 加入代码:FastString *pFS=new
11、FastString("fdfd"); l 对于以上代码提示无法链接ilink32 Error Error: Unresolved external 'FastString:FastString(char *)' referenced from D:TESTFASTSTRINGDLLBCCLIENTWIN32DEBUGUNIT1.OBJl View Project Manager 添加 FastString.lib文件链接失败 提示:无效的OMF, Possible COFF.ilink32 Error Error: 'D:TESTFASTSTRIN
12、GDLLDEBUGFASTSTRINGDLL.LIB' contains invalid OMF record, type 0x21 (possibly COFF)这里是因为跨平台,所以vc下 引用dll 和 bc下引用 效果不一样。所以如何解决这个问题呢?l 使用coff2omf 工具,cmd中输入“ coff2omf.exe FastStringDll.lib bc.lib ”进行转换。需要先退出C盘,进入D盘lib文件所在的地方到上一级目录,请使用cd.进入D盘,请使用d:进入想要的目录,请使用cd这里还有其他两种方法一、使用implib命令1、用C+Builder的implib
13、工具生成DLL对应的lib文件。生成lib文件之后,C+Builder便可以使用这个lib文件了。2、在.h中用extern "C"修饰VC导出的DLL函数。如:extern "C" _declspec(dllexport) int aFunc(int a),就可以调用了。二、coff2omf.exe工具程序coff2omf.exe将.lib转换为BCB可用的,然后添加进工程,直接使用VC的头文件就可以了。三、动态调用C/C+ code /Main.h HINSTANCE hDllInst;/声明Dll句柄 int (_stdcall *sdfm)(un
14、signed char,unsigned short,long);/声明变量C/C+ code /Main.cpp void _fastcall TForm:FormCreate(TObject *Sender) /框架启动时初始化Dll模块,这里以DllName.dll为例 if(NULL=hDllInst) hDllInst=LoadLibrary("DllName.dll"); if (hDllInst) sdfm=(int (_stdcall*)(unsigned char,unsigned short,long)GetProcAddress(hDllInst,&q
15、uot;sdfm"); 生成的新lib文件如图:l 把bc.lib 包含到项目中l 提示构造函数无法链接。 4. 在VC中,FastString 输出函数CreateObject:FastString.h文件:extern"C"_declspec(dllexport) FastString* CreateObject(char* psz);FastString.cpp 文件:FastString* CreateObject(char* psz) return new FastString(psz); l 重新编译,重新更新lib文件。l BCClient:代码改为
16、:FastString *pFS=CreateObject("fdfdd"); l 编译通过!l 但是如果加上:pFS->Length() ; / 提示链接出错。5. 把Length 和 Find 改为虚函数。以上链接通过。6. BC的运行过程。l IDE下运行无结果。l 直接运行提示出错:找不到DLLl Project options-C+(Shared Options)-> 将 Final output 设定为 Dll 所在位置 : ./Debugl 代码:FastString *pFS=CreateObject("ffdfd");int
17、 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 )
18、; 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. 对普通函数的不
19、敏感性:这里客户要用同种编译器,即vc对于以上的虚函数,改为非虚的。打乱次序后,调用不会出错。说明是通过名字解析的方式进行的。12. 所以要对接口进行抽象。降低耦合性。添加接口类:IFastString头文件: class IFastStringpublic: virtual int _stdcall Length(void)=0; virtual int _stdcall Find( char*psz)=0; IFastString(); IFastString();实现文件:#include "stdafx.h"#include "IFastString.h&
20、quot;IFastString:IFastString(void)IFastString:IFastString(void)实现类FastString.h 中:#include "IFastString.h"class FastString :public IFastString CreateObject的返回值改为IFastString其声明:extern "C" _declspec(dllexport) IFastString* CreateObject(char *psz); 放到接口头文件中。客户端代码改为:#include "IFa
21、stString.h"IFastString *pFS=CreateObject("fddfd");13. 因为接口中已经没有数据,所以自然不存在数据的敏感性。14. 在vc客户端,使用delete 进行内存释放:验证普通析构函数会出现内存泄漏。验证方法:n 接口类重新向外输出_declspec(dllexport)n 子类分配大量内存。 IFastString *pFS=CreateObject("fdfd"); int res=pFS->Length (); delete pFS; bool b= _CrtDumpMemoryLeak
22、s(); / 监控函数cout<<b<<endl;return 0;n b为1, 表示有泄漏。n 或者使用windows 任务管理器等监控机构。15. 对以上使用虚析构函数,代码为:class IFastStringpublic:IFastString(void);virtual IFastString(void);virtual int _stdcall Length(void)=0; /返回该字符串的长度virtual int _stdcall Find(char*psz)=0; /查找指定的子串;注意此时既然使用虚析构,则不用输出接口类了。验证vc客户端内存泄漏消
23、失。16. 验证在bc客户端,仍然对析构函数链接失败。IFastString *pFS=CreateObject("fddfd"); int len= pFS->Length(); delete pFS;析构函数位置不同而产生链接失败。17. 接口改为如下形式:l 取消输出l 增加Delete 虚函数。l 采用默认的构造和析构函数。class IFastStringpublic: virtual void _stdcall Delete()=0; virtual int _stdcall Length(void)=0; virtual int _stdcall Fin
24、d( char*psz)=0; ;delete的实现: void FastString:Delete () delete this;18. BC 客户端改为: IFastString *pIFS= CreateObject("fdfd"); int res=pIFS->Length() ; ShowMessage(AnsiString(res); pIFS->Delete() ;通过。19. 对接口进行改变 class IFastStringpublic: virtual void _stdcall Delete()=0; virtual int _stdcal
25、l Length(void)=0; virtual int _stdcall Find( char*psz)=0; virtual int _stdcall FindN( char*psz,int n)=0; ;FastString 实现新函数。客户端对其进行调用。生成版本2.打乱版本1和2搭配次序。l 老客户用新对象,正常。l 新客户用老对象,失败。20. 增加新的接口: class IPOpublic:virtual void _stdcall Delete()=0;virtual void _stdcall Save()=0;多重继承:class FastString:public IF
26、astString,public IPO 客户端: IPO *pIPO= dynamic_cast<IPO*>(pIFS);验证l VC在接口之间可以正常运行。IFastString *pIFS=CreateObject("fdfd"); int res=pIFS->Length ();IPO *pIPO= dynamic_cast<IPO*>(pIFS);pIPO->Save();delete pIFS;l BC 客户端运行异常21. 中性的类型转换接口改为如下形式:增加dynamic 函数。class IEOpublic: virtual void _stdcall Dynamic(char* name,void* ppI)=0; virtual void _stdcall Delete()=0;class IFastString:public IEOpublic: virtual int _stdcall Length(void)=0; virtual int _stdcall Find( char*psz)=0; ;cla
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 神经痛的治疗与护理讲课件
- 儿歌设计节奏教学课件
- 冠心病术中介入护理讲课件
- 2021-2026年中国汽车继电器市场调查研究及行业投资潜力预测报告
- 2025年中国双孢菇行业市场深度分析及投资战略咨询报告
- 2025年中国锁芯行业市场调查研究及投资前景预测报告
- 2019-2025年中国食品级二氧化碳行业市场调研分析及投资战略咨询报告
- 2025年中国湿式电除尘器市场竞争格局及投资战略规划报告
- 2023-2029年中国北京市建筑业行业市场深度评估及投资策略咨询报告
- 2025年影视设备项目可行性研究报告
- 2021年东营市专业技术人员公需科目试题及答案
- 清华版六年级信息技术下册全册教案
- 阿克苏地区国土空间规划(2021年-2035年)
- 2024年工业废水处理工(高级)技能鉴定理论考试题库(浓缩500题)
- 基本公共卫生服务项目村级考核用表
- 山东省枣庄市滕州市2023-2024学年七年级下学期期末数学试题
- 全屋定制板材直播话术脚本范文模版新手直播带货
- 2024家庭医生式服务签约协议书
- 江苏省南师附中2024届高一数学第二学期期末教学质量检测试题含解析
- 教师礼仪与沟通技巧(山东联盟)智慧树知到期末考试答案章节答案2024年潍坊学院
- 产业园企业服务规范及管理办法模板
评论
0/150
提交评论