1 / 13

十 DCOM

十 DCOM. DCOM 机制 DCOM 对象的激活方法 连接管理. 客户. 组件. 客户进程. 客户. 组件. COM. COM. 运行库. 运行库. 安全. 安全. DCE RPC. DCE RPC. 提供器. 提供器. LPC. LPC. 1. DCOM 机制. 从进程内走向进程外 进程透明性. COM. COM. 客户. 组件. 运行库. 运行库. 安全. 安全. DCE RPC. DCE RPC. 提供器. 提供器. 协议栈. 协议栈. DCOM. 网络协议.

ling
Download Presentation

十 DCOM

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 十 DCOM • DCOM机制 • DCOM对象的激活方法 • 连接管理

  2. 客户 组件 客户进程 客户 组件 COM COM 运行库 运行库 安全 安全 DCE RPC DCE RPC 提供器 提供器 LPC LPC 1. DCOM机制 • 从进程内走向进程外 进程透明性

  3. COM COM 客户 组件 运行库 运行库 安全 安全 DCE RPC DCE RPC 提供器 提供器 协议栈 协议栈 DCOM 网络协议 • 从本机走向远程主机 DCOM • RPC Client and RPC Server • 可以在TCP、UDP上实现 • RPC是分布式应用的基础,过程如下: • 客户准备:三元组(远程机器、server、函数) • 在RPC Server上需要运行一个RPC端口管理服务,每个RPC Server向它登记注册 • RPC client与远程机的RPC端口管理服务联系,请求RPC Server的端口号 • 然后RPC client与RPC server直接联系 • 其他远程调用途径,如HTTP、SOAP

  4. OR Client Server ORPC proxy stub IPC IPC RPC OR service OXID表 OXID表 OR service • DCOM使用ORPC协议实现远程通信 • DCOM的通讯机制建立在RPC基础上,DCOM对其进行了扩充,以支持面向对象的调用。称为ORPC。 ORPC使用标准的RPC数据包,附加上专用于DCOM的信息,如接口指针标致符。在ORPC数据包经过列集后的数据按照NDR格式保存 • ORPC 优先选择UDP协议,并重新实现了纠错,拥塞控制,重传等算法. • 实际的开发工作并不必在ORPC上进行。底层的通讯由代理和存根完成的,而如果使用标准列集法,则代理和存根可以由MIDL完成。进一步,如果使用IDE,IDE在工程配置中集成了MIDL的操作。

  5. 客户 组件 调用创建函数 COM 库 创建进程和对象 (OLE32.DLL) 远程创建 SCM SCM RPC (RPCSS.EXE) (RPCSS.EXE) • 激活对象的任务是SCM来完成的。SCM是COM库的一部分。SCM负责创建信息的对象,也负责建立对象与客户之间的连接。创建对象时,它会通过RPC调用远程机器上的SCM,由远程机器上的SCM启动组件进程,并创建组件对象,然后返回给客户机器。 • 组件对象在创建完成之后,在返回到客户机器的途中,还要经过列集和散集的处理。包括创建代理对象和装载存根代码。这些处理和本地进程外组件的处理一致。一旦组件的创建过程完成,客户与组件的通讯不再通过SCM,而是直接通过代理对象和存根对象以及COM库的底层传输机制完成。

  6. 三种COM服务器进程模型对比(进程内,进程外,远程)三种COM服务器进程模型对比(进程内,进程外,远程)

  7. DCOM的特性: 1。可伸缩性scaleable 2。平台独立 3。协议无关 多种底层协议支持 4。安全性 操作系统的安全性 5。可配置性 DCOMCNFG

  8. 2 DCOM对象的激活方法 • 进程外对象的激活方法。 方法一。使用注册表,DCOMCNFG配置工具。(位置透明,代码不变) • 创建一个进程外组件。(使用ATL COM,EXE方式,无人机界面)在服务器端注册。此时在服务器端可以调用此组件。 • 在客户端注册此组件。 方法:开始-》运行-》找到网络上服务器器-》找到组件程序-》加上/regserver 参数 注册结果: HKEY_CLASSES_ROOT\CLSID\ {classid_guid} “APPID”=“<appid_guid>” LocalServer子键下有组件程序的UNC名字 HKEY_CLASSES_ROOT\APPID\{appid_guid} “RemoteServerName”=”<DNS Name>” • 使用DCOMCNFG配置此组件 使用DCOMCNFG配置使得组件程序在服务器端运行。 • 客户端代码与使用COM完全一致。 注意:上述操作顺利实现需要: • 网络协议的支持(Tcp/IP) • DNS服务,NetBios协议的支持 • RPC服务的支持。

  9. 方法二:在代码中指定服务器信息。(代码变动)方法二:在代码中指定服务器信息。(代码变动) • WINOLEAPI CoCreateInstanceEx • WINOLEAPI CoGetInstanceFromFile • WINOLEAPI CoGetInstanceFromIStorage 以上函数都可以用来创建远程对象。 • 指定COSERVERINFO结构的信息。 • typedef struct _COSERVERINFO { DWORD dwReserved1; LPWSTR pwszName; // 远程机器名字 DNS名字 COAUTHINFO __RPC_FAR *pAuthInfo; //表示激活安全信息。 DWORD dwReserved2; } COSERVERINFO typedef struct _MULTI_QI { const IID* pIID; //客户指定的要返回的目标对象的接口IID IUnknown * pItf; // 用来保存接口的指针 HRESULT hr; } MULTI_QI;//此结构可以保存多个接口指针。

  10. MULTI_QI mqi[]={ {IID_Iif1,NULL,hr1},{IID_Iif2,NULL,hr2}}; COSERVERINFO srvinfo={0,"server",NULL,0}; HRESULT hr=CoCreateInstance(CLSID_RemoteObj,//远程对象的CLSID NULL,//没有被聚合 CLSCTX_SERVER,//运行环境为进程外组件 &srvinfo,//服务器信息 sizeof(mqi)/sizeof(mqi[0]),//接口个数 &mqi}//返回接口指针数组 if(SUCCEEDED(hr)){ if(SUCCEEDED(mqi[0].hr)) { Iif1 * pif1=mqi[0].pItf; pIf1->...... pIf1->Release(); } if(SUCCEEDED(mqi[0].hr)) { Iif2 * pif2=mqi[1].pItf; pIf2->...... pIf2->Release(); } } 由于网络开销,使用MULTI_QI 的方式一次取得多个指针。

  11. 远程进程内组件激活方法 • 远程进程内组件DLL也有两种创建方式。 1。在客户端对远程的进程内对象进行注册之后,客户在运行时将在客户端的进程内加载dll。 2。使用远程机器上的代理进程启动远程进程内组件。Dllsurrogate配置方法见p313 使用远程名字对象。 IBindCtx *pBC=NULL; DWORD dwEaten; IMoniker *pMoniker=NULL; IDispatch *pDispatch=NULL; Hr=CreateBindCtx(&pBC); if(SUCCEEDED(Hr)){ Hr=MkParseDisplayName(pBC,L"\\\\MyServer\\MyTable.xls!Sheet1!R1C1:R2C2", &dwEaten,&pMoniker); if(SUCCEEDED(hr)){ pMoniker->BindToObject(pBC,NULL,IID_IDispatch,&pDispatch); pDispatch->Invoke(......); ..... pDispatch->Release(); pMoniker->Release() } pBC->Release(); 必须指定COM对象的存储激活特性。

  12. 3 连接管理 • 1. PING机制 • 对于非正常情况,若组件进程非正常终止,客户可以根据返回值判断出来 • 若客户非正常终止,组件进程该怎么办? • 为了检测客户程序是否非正常终止,DCOM提供了“pinging”机制 对象Ping客户. • 每个被远程使用的对象都有“pingPeriod”和“numPingsToTimeOut”计数 • ping周期:pingPeriod*numPingsToTimeOut • 当前DCOM版本中,pingPeriod=2(分)且numPingsToTimeOut=3,这些值不能被改变 • pinging机制的优化:OXID解析器产生ping集,减轻网络负担 • (同一台机器上的对象,同时发出PING)

  13. 客户 对象A 对象B 客户机器 A机器 B机器 • 2.连接传递. • 连接具有可传递性,因为接口的列集数据(OR或者OBJREF)包含机器相关的信息 • 客户机器上的客户通过A服务器上的对象A得到了B机器上的对象B的指针后, 客户对对象B的访问直接进行,不需要通过A机器.

More Related