10 跨程特性.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
十. COM跨进程特性 进程外组件 进程内COM对象的缺陷 引出函数 列集 列集的概念 接口指针的列集 标准列集过程 总体结构 存根 代理 接口列集器 ORPC通道 标准列集的实现 自定义列集 IMarshal接口 例子 1.进程外组件 1.1 进程内COM对象的缺陷 缺乏错误隔离. 对象的运行时错误将直接引起客户程序的崩溃. 安全环境与权限共享 对象在客户进程中,使用客户进程的安全环境与权限. 这意味着 特权客户程序创建的对象可以进行危险的操作; 较低权限的用户创建的对象可能无法访问一些重要的资源,从而无法达到计划的目的. 很难实现分布式计算 进程外的COM组件是实现DCOM的基础. 进程外的COM对象具有重要的意义. 无论哪种方式(进程内,进程外,远程)对客户而言,是透明的. 1.2 引出函数 进程外COM组件的实现以exe的形式存在.可以独立执行.不能引出任何函数。 DllRegisterServer 和DllUnregisterServer. DllGetClassObject DllCanUnloadNow 注册:执行时会检测命令行中是否有参数/ RegServer或/UnregServer, 以决定是否进行注册(注销). 注册表中用LocalServer32键代替InprocServer32键. 创建类厂:当客户调用CoGetClassObject创建类厂对象时: 在CoGetClassObject函数内部,它找到EXE组件的程序位置后,发现是一个进程外组件, 于是启动组件进程,然后等待... 组件进程启动后(使用了/Embedding参数),调用CoInitialize初始化,创建所有的类厂,调用CoRegisterClassObject把类厂注册到COM中. 客户进程得到了组件的类厂信息,创建类厂,然后创建对象…. 组件卸载:判断是否可以退出的条件与dll相类似. 组件进程退出时,使用CoRevokeClassObject函数在COM库中注销掉其所支持的类厂. CoRegisterClassObject与 CoRevokeClassObject要配对使用,以保证COM信息的一致性. 2. 进程间通讯 进程间通讯方式: 共享内存,管道,消息队列等等。 进程外COM组件与客户进程之间使用RPC进行通讯. COM对MS RPC其进行了扩充,以支持面向对象的调用。称为ORPC (Object Remote Procedure Call) 。 ORPC使用标准的RPC数据包,附加上专用于COM的信息,如接口指针标识符。在ORPC数据包经过列集后的数据按照NDR格式保存(网络数据表示法Network Data Representation)(CORBA使用CDR Common Data Representation,Web服务使用XML)。 示意图如下: 在客户进程与组件对象之间是代理对象和存根对象. 代理和存根直接使用系统RPC. 在机器内部,RPC有简化版本LPC。 在ORPC中, 调用请求和返回结果要经过列集和散集的过程. 其定义如下. 2.1 列集的概念 列集(marshaling) 和散集(unmarshaling) marshal的含义:编组、调度、引导、安排 整顿、配置、汇集、排列、集合 定义:是指客户进程可以透明地调用另一进程中的对象成员函数的一种参数处理机制 在调用过程中如果涉及到数值或指针的传递,则列集过程如下: 数值: 比如一个32位整数, 把四个字节的数据顺序装入到字节流中即可. 地址: 一个进程中的地址对另一个进程没有意义. 因此,列集时是把地址中的数据取出来封装到数据包中,散集时,在客户进程中分配一块内存数据包中的数据拷贝到内存中,然后返回内存地址. 接口指针: 实际上列集更重要的工作在于获取对象的接口指针.客户程序的一个有效接口指针代表客户进程到组件进程的一个连接.列集一个接口指针远比一个一般的指针要复杂. 以下讨论的列集一般都指接口指针的列集. 2.2 接口指针的列集 接口指针列集的结果是把它变为一个可以被传输的字节流,字节流的内容唯一地标识了对象和对象所处的环境. (即套间 Apartment 见后, 现在可以理解为运行环境) 列集过程分为两种:标准列集和自定义列集.由于列集要使用到底层的传输协议,而这些代码往往对所有的对象而言是类似的,所以COM提供了标准列集法, 凡是没有特别指明的,都是使用标准列集法. 为了效率等因素,对象可以选择自己控制底层的通讯. 称为自定义列集法. 标准列集方式下的接口指针列集数据流. 见下图: 其中OXID代表了对象的运行环境(套间). 代理需要使用此OXID

文档评论(0)

638922bb + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档