高级软件工程(dcom、自动化)ppt培训课件

上传人:aa****6 文档编号:54583610 上传时间:2018-09-15 格式:PPT 页数:61 大小:124.50KB
返回 下载 相关 举报
高级软件工程(dcom、自动化)ppt培训课件_第1页
第1页 / 共61页
高级软件工程(dcom、自动化)ppt培训课件_第2页
第2页 / 共61页
高级软件工程(dcom、自动化)ppt培训课件_第3页
第3页 / 共61页
高级软件工程(dcom、自动化)ppt培训课件_第4页
第4页 / 共61页
高级软件工程(dcom、自动化)ppt培训课件_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《高级软件工程(dcom、自动化)ppt培训课件》由会员分享,可在线阅读,更多相关《高级软件工程(dcom、自动化)ppt培训课件(61页珍藏版)》请在金锄头文库上搜索。

1、5、DCOM,DCOM,COM特性 语言无关性 二进制 复用性包含方式聚合方式 进程透明性进程内服务程序: DLL本地服务程序: EXE远地服务程序: DLL或EXE =DCOM,为什么需要跨越进程、跨越计算机?软件规模持续增加不同EXE程序之间需要交互不同EXE程序可以分布在不同的计算机上适用于分布式计算环境关键问题:进程空间不同,DCOM,内 容跨越进程 IDL/MIDL 本地服务器的实现 远程访问(DCOM)的实现 DCOM的特性,DCOM,(1)跨越进程,每一个EXE文件都将在不同的进程中运行 每一个进程都有自己的进程空间 DLL将被映射到连接它们的EXE文件的进程空间DLL被称为进程

2、中服务器(Inproc server)EXE被称为进程外服务器(Outproc server) DLL提供的构件将接口传给客户一个接口实际上是一个函数指针数组 客户必须能够访问同接口相关联的内存,DCOM,对于跨越进程边界的接口 需满足如下要求:一个进程需要能够调用另外一个进程中的函数一个进程需要能够将数据传递给另外一个进程客户无须关心它所访问的服务器是DLL还是EXE,DCOM,本地过程调用,不同进程间通信的方法:DDE管道共享内存等LPCCOM:LPC基于RPC的单机进程间通信技术 DCOM:RPC,DCOM,LPC由操作系统实现,客户,构件,EXE,EXE,LPC,进程边界,DCOM,编

3、排(Marshal),将函数调用的参数从一个进程的地址空间中传到 另外一个进程的地址空间中 LPC:将参数数据从一个进程的地址空间复制到 另外一个进程的地址空间中 RPC:需要考虑不同机器在数据表示方面的不同支持编排的接口为:IMarshal,DCOM,代理/残根DLL(surrogate/stub),客户同一个模仿构件的DLL通信这个DLL可以为客户完成 参数的编排与LPC调用这个DLL被称为 代理构件需要另一个DLL这个DLL为构件完成 参数的反编排与LPC调用,DCOM,客户,构件,EXE,EXE,LPC,进程边界,代理,残根,DLL,DLL,DCOM,(2)IDL/MIDL,先利用ID

4、L语言编写接口的描述在利用MIDL编译器生成代理和残根DLL与UUID、RPC类似IDL是从开发软件基金会OSF的分布式计算环境(DCE)借用过来的IDL语法与 C、C+相同COM只利用了IDL的一个子集并进行了扩展MIDL编译器接收接口的IDL描述并生成相应的代理和残根DLL,DCOM,IDL开发人员可以不知道LPC的细节但必须知道如何利用IDL描述自己的接口但是 IDL不规范:存在不一致文档资料差缺乏典型的好例子IDL可用于:生成代理和残根DLL建立类型库(Type Library),DCOM,IDL例子:import “unknwn.idl“ ; / Interface IX objec

5、t,uuid(32bb8323-b41b-11cf-a6bb-0080c7b2d682),helpstring(“IX Interface“),pointer_default(unique) interface IX : IUnknown HRESULT FxStringIn(in, string wchar_t* szIn) ;HRESULT FxStringOut(out, string wchar_t* szOut) ; ;,DCOM,接口头(属性列表):(1)object: 所定义的接口为一个COM接口(2)uuid(.):接口的IID(3)helpstring(.):将帮助串放类型库

6、中(4)pointer_default(unique):如何处理指针使用IDL的目的在于提供足够的信息以便函数参数可以被调整因此IDL需要知道如何处理指针 pointer_default的作用在于告诉MIDL在没有为指针指定其它属性时如何处理指针,DCOM,pointer_default具有三个不同的选项: ref: 将指针当成引用对待该类指针 总是指向一个合法的地址不能为空在调用前后指向相同的内存地址在函数内部不能为其指定别名 unique: 该类指针 可以为空在函数内可以修改其值不能为其指定别名 ptr: 将指针指定为C指针该类指针 可以有别名可以为空可以修改其值 MIDL 将使用这些值对

7、它生成的代理及残根代码优化,DCOM,IDL中的输入/输出参数,利用 in , out这两个参数属性MIDL可以对代理及残根代码进行进一步的优化对于被标记为 in 的参数MIDL将知道仅仅需要将此参数值从客户传递给构件残根代码不需要回送任何值 对于被标记为 out 的参数MIDL将知道该参数仅被用类从构件向客户回送数据代理不需对输出参数值进行调整也不需将该值传送给构件 可以同时使用两个关键字标记某一参数 输出参数必须为指针,DCOM,IDL中的字符串,对数据块进行编排时 必须知道数据块的大小 C+串的长度易于决定 COM对字符串的标准约定是使用Unicode字符:wchar_t也可以使用LOL

8、ECHAR 或者 LPOLESTR,IDL中的import,与C+中的 #include 类似可以使用任意次 而不会引起重复定义 所有COM及OLE(ActiveX)的标准接口皆定义于相应的IDL中一般位于C+编译器的 INCLUDE文件中,DCOM,IDL中的 size_is,object,uuid(32bb8324-b41b-11cf-a6bb-0080c7b2d682),helpstring(“IY Interface“),pointer_default(unique) interface IY : IUnknown HRESULT FyCount(out long* sizeArray

9、) ;HRESULT FyArrayIn(in long sizeIn, in, size_is(sizeIn) long arrayIn) ;HRESULT FyArrayOut(out, in long* psizeInOut, out, size_is(*psizeInOut) long arrayOut) ; ;,DCOM,MIDL编译器,foo.idl,Midl.exe,foo.ii,foo_p.c,foo_i.c,dlldata.c,foo.def,makefile,C编译器 与连接器,foo.dll,.,DCOM,Makefile 中的主要语句:midl /h Iface.h /

10、iid Guids.c /proxy Proxy.c Server.idlServer.dll: $(SERVER_OBJS) Server.deflink $(DLL_LINK_FLAGS) $(SERVER_OBJS) libcmtd.lib libcimtd.lib $(LIBS) /DEF:Server.defregsvr32 -s Server.dllServer.exe: $(SERVER_OBJS) $(DIR_SERVER)OutProc.obj Server.reslink $(EXE_LINK_FLAGS) $(SERVER_OBJS) $(DIR_SERVER)OutPr

11、oc.obj Server.res libcmtd.lib libcimtd.lib $(LIBS) user32.lib gdi32.libServer /RegServerClient.exe : Client.obj Guids.obj Util.objlink $(EXE_LINK_FLAGS) Client.obj Guids.obj Util.objlibcmtd.lib libcimtd.lib $(LIBS),DCOM,(3)本地服务器的实现,进程内服务器模式中DllGetClassObject 创建类厂因为EXE不输出函数必须给CoGetClassObject提供获取ICla

12、ssFactory的方法COM的解决方案是:维护一个关于被登记类厂的内部表格,DCOM,当客户调用CoGetClassObject时COM首先检查关于类厂的私有表格以得到与客户请求的CLSID相应的类厂若相应的类厂不在表格中COM在注册表中查找并启动相应的EXE此EXE将完成相应类厂的登记EXE调用CoRegisterClassObject完成类厂的登记,DCOM,BOOL CFactory:StartFactories() CFactoryData* pStart = ,DCOM,HRESULT hr = :CoRegisterClassObject(*pData-m_pCLSID,stat

13、ic_cast(pIFactory),CLSCTX_LOCAL_SERVER,REGCLS_MULTIPLEUSE,DCOM,构件注册:,CoRegisterClassObject( *pData-m_pCLSID,static_cast(pIFactory),CLSCTX_LOCAL_SERVER,REGCLS_MULTIPLEUSE,m_pCLSID:类标识 pIFactory: 类厂指针 第四个参数:EXE的单个实例能否支持一个构件的多个实例REGCLS_SINGLEUSER: 单个实例则第三个参数为CLSCTX_LOCAL_SERVERREGCLS_MULTI_SEPARATE:多个实

14、例第三个参数可以为CLSCTX_LOCAL_SERVER或者 CLSCTX_LOCAL_SERVER| CLSCTX_INPROC_SERVER,DCOM,CoRegisterClassObject( *pData-m_pCLSID,static_cast(pIFactory),CLSCTX_LOCAL_SERVER,REGCLS_MULTIPLEUSE,与,CoRegisterClassObject( *pData-m_pCLSID,static_cast(pIFactory),CLSCTX_LOCAL_SERVER| CLSCTX_INPROC_SERVER,REGCLS_MULTI_SE

15、PARATE,是等价的,DCOM,(4)远程访问的实现,前述的本地服务器可以是远地服务器即 不需要对CLIENT.EXE或SERVER.EXE进行任何修改需要系统的支持:Windows NT4.0 或者 DCOM for Windows95它们需要DCOM配置工具 DCOMCNFG.EXE,DCOM,从远地服务器运行SERVER.EXE的步骤 :动作 本地系统 远程系统 建立CLIENT.EXE、SERVER.EXE 以及 PROXY.DLL 将CLIENT.EXE、SERVER.EXE 以及 PROXY.DLL复制到远地 使用命令 server/RegServer登记本地服务器 使用命令 regsvr32 Proxy.dll登记代理 运行CLIENT.EXE,并选择本地服务器 运行DCOMCNFG.EXE, 输入将要运行 SERVER.EXE的远程机器名 单击Identity选项,选择Interactive User 根据自己的权限设置Security选项 运行SERVER.EXE 运行CLIENT.EXE ,DCOM,创建构件函数:CoCreateInstanceEx( CLSID_COMPONENT1,NULL,CLSCTX_REMOTE_SERVER,&ServerInfo,3,/Number of interfaces&mqi):,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号