




已阅读5页,还剩56页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
5、DCOM,DCOM,COM特性语言无关性二进制复用性包含方式聚合方式进程透明性进程内服务程序:DLL本地服务程序:EXE远地服务程序:DLL或EXE=DCOM,为什么需要跨越进程、跨越计算机?软件规模持续增加不同EXE程序之间需要交互不同EXE程序可以分布在不同的计算机上适用于分布式计算环境关键问题:进程空间不同,DCOM,内容跨越进程IDL/MIDL本地服务器的实现远程访问(DCOM)的实现DCOM的特性,DCOM,(1)跨越进程,每一个EXE文件都将在不同的进程中运行每一个进程都有自己的进程空间DLL将被映射到连接它们的EXE文件的进程空间DLL被称为进程中服务器(Inprocserver)EXE被称为进程外服务器(Outprocserver)DLL提供的构件将接口传给客户一个接口实际上是一个函数指针数组客户必须能够访问同接口相关联的内存,DCOM,对于跨越进程边界的接口需满足如下要求:一个进程需要能够调用另外一个进程中的函数一个进程需要能够将数据传递给另外一个进程客户无须关心它所访问的服务器是DLL还是EXE,DCOM,本地过程调用,不同进程间通信的方法:DDE管道共享内存等LPCCOM:LPC基于RPC的单机进程间通信技术DCOM:RPC,DCOM,LPC由操作系统实现,客户,构件,EXE,EXE,LPC,进程边界,DCOM,编排(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,先利用IDL语言编写接口的描述在利用MIDL编译器生成代理和残根DLL与UUID、RPC类似IDL是从开发软件基金会OSF的分布式计算环境(DCE)借用过来的IDL语法与C、C+相同COM只利用了IDL的一个子集并进行了扩展MIDL编译器接收接口的IDL描述并生成相应的代理和残根DLL,DCOM,IDL开发人员可以不知道LPC的细节但必须知道如何利用IDL描述自己的接口但是IDL不规范:存在不一致文档资料差缺乏典型的好例子IDL可用于:生成代理和残根DLL建立类型库(TypeLibrary),DCOM,IDL例子:importunknwn.idl;/InterfaceIXobject,uuid(32bb8323-b41b-11cf-a6bb-0080c7b2d682),helpstring(IXInterface),pointer_default(unique)interfaceIX:IUnknownHRESULTFxStringIn(in,stringwchar_t*szIn);HRESULTFxStringOut(out,stringwchar_t*szOut);,DCOM,接口头(属性列表):(1)object:所定义的接口为一个COM接口(2)uuid(.):接口的IID(3)helpstring(.):将帮助串放类型库中(4)pointer_default(unique):如何处理指针使用IDL的目的在于提供足够的信息以便函数参数可以被调整因此IDL需要知道如何处理指针pointer_default的作用在于告诉MIDL在没有为指针指定其它属性时如何处理指针,DCOM,pointer_default具有三个不同的选项:ref:将指针当成引用对待该类指针总是指向一个合法的地址不能为空在调用前后指向相同的内存地址在函数内部不能为其指定别名unique:该类指针可以为空在函数内可以修改其值不能为其指定别名ptr:将指针指定为C指针该类指针可以有别名可以为空可以修改其值MIDL将使用这些值对它生成的代理及残根代码优化,DCOM,IDL中的输入/输出参数,利用in,out这两个参数属性MIDL可以对代理及残根代码进行进一步的优化对于被标记为in的参数MIDL将知道仅仅需要将此参数值从客户传递给构件残根代码不需要回送任何值对于被标记为out的参数MIDL将知道该参数仅被用类从构件向客户回送数据代理不需对输出参数值进行调整也不需将该值传送给构件可以同时使用两个关键字标记某一参数输出参数必须为指针,DCOM,IDL中的字符串,对数据块进行编排时必须知道数据块的大小C+串的长度易于决定COM对字符串的标准约定是使用Unicode字符:wchar_t也可以使用LOLECHAR或者LPOLESTR,IDL中的import,与C+中的#include类似可以使用任意次而不会引起重复定义所有COM及OLE(ActiveX)的标准接口皆定义于相应的IDL中一般位于C+编译器的INCLUDE文件中,DCOM,IDL中的size_is,object,uuid(32bb8324-b41b-11cf-a6bb-0080c7b2d682),helpstring(IYInterface),pointer_default(unique)interfaceIY:IUnknownHRESULTFyCount(outlong*sizeArray);HRESULTFyArrayIn(inlongsizeIn,in,size_is(sizeIn)longarrayIn);HRESULTFyArrayOut(out,inlong*psizeInOut,out,size_is(*psizeInOut)longarrayOut);,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/hIface.h/iidGuids.c/proxyProxy.cServer.idlServer.dll:$(SERVER_OBJS)Server.deflink$(DLL_LINK_FLAGS)$(SERVER_OBJS)libcmtd.liblibcimtd.lib$(LIBS)/DEF:Server.defregsvr32-sServer.dllServer.exe:$(SERVER_OBJS)$(DIR_SERVER)OutProc.objServer.reslink$(EXE_LINK_FLAGS)$(SERVER_OBJS)$(DIR_SERVER)OutProc.objServer.reslibcmtd.liblibcimtd.lib$(LIBS)user32.libgdi32.libServer/RegServerClient.exe:Client.objGuids.objUtil.objlink$(EXE_LINK_FLAGS)Client.objGuids.objUtil.objlibcmtd.liblibcimtd.lib$(LIBS),DCOM,(3)本地服务器的实现,进程内服务器模式中DllGetClassObject创建类厂因为EXE不输出函数必须给CoGetClassObject提供获取IClassFactory的方法COM的解决方案是:维护一个关于被登记类厂的内部表格,DCOM,当客户调用CoGetClassObject时COM首先检查关于类厂的私有表格以得到与客户请求的CLSID相应的类厂若相应的类厂不在表格中COM在注册表中查找并启动相应的EXE此EXE将完成相应类厂的登记EXE调用CoRegisterClassObject完成类厂的登记,DCOM,BOOLCFactory:StartFactories()CFactoryData*pStart=,DCOM,HRESULThr=:CoRegisterClassObject(*pData-m_pCLSID,static_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:多个实例第三个参数可以为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_SEPARATE,是等价的,DCOM,(4)远程访问的实现,前述的本地服务器可以是远地服务器即不需要对CLIENT.EXE或SERVER.EXE进行任何修改需要系统的支持:WindowsNT4.0或者DCOMforWindows95它们需要DCOM配置工具DCOMCNFG.EXE,DCOM,从远地服务器运行SERVER.EXE的步骤:动作本地系统远程系统建立CLIENT.EXE、SERVER.EXE以及PROXY.DLL将CLIENT.EXE、SERVER.EXE以及PROXY.DLL复制到远地使用命令server/RegServer登记本地服务器使用命令regsvr32Proxy.dll登记代理运行CLIENT.EXE,并选择本地服务器运行DCOMCNFG.EXE,输入将要运行SERVER.EXE的远程机器名单击Identity选项,选择InteractiveUser根据自己的权限设置Security选项运行SERVER.EXE运行CLIENT.EXE,DCOM,创建构件函数:CoCreateInstanceEx(CLSID_COMPONENT1,NULL,CLSCTX_REMOTE_SERVER,LPWSTRpwszName;/远地机器名COAUTHINFO*pAuthInfo;/创建对象的激活安全信息DWORDdwReserved2;COSERVERINFO,DCOM,mqi:multiQueryInterface,用于同时查询多个接口MULTI_QImqi3;mqi0.pIID=IID_IX;mqi0.pItf=NULL;mqi0.hr=S_OK;mqi1.pIID=IID_IY;mqi1.pItf=NULL;mqi1.hr=S_OK;mqi2.pIID=IID_IZ;mqi2.pItf=NULL;mqi2.hr=S_OK;,DCOM,(5)DCOM的特性,平台独立性应用系统可以跨越不同的操作系统原因:建立在DCE的RPC基础之上协议无关性应用系统是协议无关的目前支持:TCP/IP、UDP、IPX/SPX、NetBIOS可伸缩性应用系统能适应规模的变化支持多CPU,DCOM,DCOM,可配置性对服务器的变化客户程序的自动安装等可以灵活配置安全性使用了WindowsNT提供的可扩展安全性框架实现的安全性包括:访问安全性激发安全性等,6、自动化,一种客户与构件之间通信的方法COM接口自动化(OLE自动化)Word、Excel及VB、Java都使用了自动化技术特点:使得用解释性语言和宏语言访问COM构件更为容易编写COM构件也将更为容易关注运行时的类型检查以牺牲速度与编译时类型检查为代价,自动化,自动化不独立于COM建立在COM基础上一个自动化服务器是一个实现了IDispatch接口的COM构件一个自动化控制器是一个通过IDispatch接口同自动化服务器进行通信的COM客户自动化控制器不直接调用自动化服务器实现的函数而是通过IDispatch接口中的成员函数实现对服务器中函数的间接调用,自动化,内容IDispatch接口IDispatch的使用类型库IDispatch的实现,自动化,(1)IDispatch接口,IDispatch接口是作为VB的一部分开发出来的COM构件通过一个标准的接口(IDispatch)提供构件支持的服务而不必提供多个特定于服务的接口IDispatch将接收一个函数的名称并执行它,自动化,interfaceIDispatch:IUnknowntypedefuniqueIDispatch*LPDISPATCH;HRESULTGetTypeInfoCount(outUINT*pctinfo);HRESULTGetTypeInfo(inUINTiTInfo,inLCIDlcid,outITypeInfo*ppTInfo);HRESULTGetIDsOfNames(inREFIIDriid,in,size_is(cNames)LPOLESTR*rgszNames,inUINTcNames,inLCIDlcid,out,size_is(cNames)DISPID*rgDispId);,自动化,HRESULTInvoke(inDISPIDdispIdMember,inREFIIDriid,inLCIDlcid,inWORDwFlags,in,outDISPPARAMS*pDispParams,outVARIANT*pVarResult,outEXCEPINFO*pExcepInfo,outUINT*puArgErr);,自动化,执行函数时自动化控制程序将调度标识传给Invoke成员函数自动化服务器根据调度标识使用case语句执行不同的代码Invoke的工作方式与vtbl类似:都实现一组按索引访问的函数都可以定义接口IDispatch:Invoke的一个实现所包含的函数集被称作一个调度接口(不是COM接口),自动化,pVtbl,QueryInterface,AddRef,Release,GetTypeInfoCount,GetTypeInfo,GetIIDsOfNames,Invoke,Idispatch*pIDispatch,HRESULTFx();HRESULTFxStringIn(inBSTRbstrIn);HRESULTFxStringOut(out,retvalBSTR*pbstrOut);HRESULTFxFakeError();,自动化,(2)IDispatch的使用,Invoke函数的参数,inDISPIDdispIdMember,控制程序待调用函数的DISPIDinREFIIDriid,保留(IID_NULL)inLCIDlcid,位置信息inWORDwFlags,in,outDISPPARAMS*pDispParams,outVARIANT*pVarResult,outEXCEPINFO*pExcepInfo,outUINT*puArgErr,自动化,WordwFlags:指定所调用函数的类型:DISPATCH_METHOD常规函数DISPATCH_PROPERTYGET获取属性函数DISPATCH_PROPERTYPUT设置属性函数DISPATCH_PROPERTYPUTREF通过引用设置属性的函数,自动化,DISPPARAMS*pDispParams,传递给被调用函数的参数typedefstructtagDISPPARAMSVARIANTARG*rgvarg;DISPID*rgdispidNamedArgs;unsignedintcArgs;unsignedintcNamedArgs;DISPPARAMS;其中,每一个参数类型都是VARIANTARG。VARIANTARG是许多不同类型值的联合这导致了:只有那些能够被放到VARIANTARG结构中的类型才可以通过调度接口进行传递。,自动化,VARIANT*pVarResult指向VARIANT结构的指针用于Invoke所执行的函数的结果。,EXCEPINFO*pExcepInfo指向一个EXCEPINFO的指针用于表示执行过程中遇到的例外情况UINT*puArgErr保存与执行错误相应的参数的索引Invoke的返回值为:DISP_E_PARAMNOTFOUND或DISP_E_TYPEMISMATCH,自动化,例子hr=pIDispatch-GetIDsOfNames(IID_NULL,/DatafortheVARIANT,自动化,/FillintheDISPPARAMSstructure.DISPPARAMSparam;param.cArgs=1;/Numberofargumentsparam.rgvarg=,自动化,VARIANT类型,对于VARIANT结构的初始化是借助于函数VariantInit完成的。在VARIANT结构中标识所保存数据的类型。VARIANT使得VB程序在调用一个调度接口方法之前不需要知道此方法需要哪些参数VB将接受用户输入的任何参数并将其填充到VARIANT结构中这与利用头文件描述函数接口的强类型检查方式大为不同。将类型检查推迟到运行时完成需要调度接口的方法和函数对它们接受到的参数的类型进行检查,自动化,调度接口通常需要为程序员完成某些类型的转换自动化提供VariantChangeType函数完成转换HRESULTVariantChangeType(VARIANTARG*pVarDest,VARIANTARG*pVarSrc,unsignedshortwFlags,VARTYPEvtNew),自动化,BSTR数据类型,BasicString;(Binarystring),带有字符计数值的字符串字符计数值保存在字符数组的开头给BSTR赋值需要使用:SysAllocString.,SAFEARRAY类型,包含边界信息的数组,自动化,(3)类型库,与语言无关的适合于解释性语言和宏语言使用的C+头文件的替换物提供有关构件、接口、方法、属性、参数、结构的类型信息其内容与C+头文件中的内容相同是IDL文件的一个编译版本不是需被分析的文本文件而是二进制文件自动化库为创建和读取该二进制文件提供了一些标准构件,自动化,类型库的创建CreateTypeLib可以创建一个类型库在IDL/MIDL之前ODL/MkTypLib是生成类型库的主要途径目前利用IDL与MIDL编译器创建类型库的方法更普遍使用IDL建立类型库的关键是library语句library语句之后的内容皆将被编译到类型库中,自动化,/InterfaceIXobject,uuid(32BB8326-B41B-11CF-A6BB-0080C7B2D682),helpstring(IXInterface),pointer_default(unique),dual,oleautomationinterfaceIX:IDispatchimportoaidl.idl;HRESULTFx();HRESULTFxStringIn(inBSTRbstrIn);HRESULTFxStringOut(out,retvalBSTR*pbstrOut);HRESULTFxFakeError();,自动化,uuid(D3011EE1-B997-11CF-A6BB-0080C7B2D682),version(1.0),helpstring(InsideCOM,Chapter111.0TypeLibrary)libr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 风险管理在公司战略执行中的约束与支持性试题及答案
- 风险战略规划与实施试题及答案
- 构建诚信企业的年度工作措施计划
- 促进仓库文化建设与传播计划
- 科技创新与创业的结合实践试题及答案
- 智能化在生产工作计划中的实践
- 网络安全事件响应流程试题及答案
- 2024年四川传媒学院辅导员考试真题
- 中小企业品牌发展的挑战与机遇计划
- 2024年河北省林业和草原局下属事业单位真题
- 2024年全国职业院校技能大赛高职组(检验检疫技术赛项)考试题库(含答案)
- 2023年广东广州中考满分作文《一样的舞台不一样的我》
- 2024-2030年中国商用显示产业投资策略及发展规划建议研究研究报告
- (完整)北京版小学英语1至6年级词汇(带音标)
- 中西文化鉴赏智慧树知到答案2024年郑州大学
- 职业技术学院《新能源汽车结构原理与维修》课程标准
- DL∕T 1901-2018 水电站大坝运行安全应急预案编制导则
- 实验室可靠性测试计划表
- 大型活动交通保障方案
- 居间费用协议合同范本
- 云南省昆明市2023-2024学年高二下学期期末质量检测化学试题
评论
0/150
提交评论