快速业务通道

COM原理及应用----COM特性

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-05-23
调用组件对象的成员函数,如同调用本进程内的函数一样,这正是COM所期望达到的透明效果。

7、进程外组件对象与客户程序之间通信过程

接口指针所指的是本进程中的代理对象(proxy),客户调用的是代理对象的成员函数,由代理对象通过跨进程的调用方法(LPC/RPC)与对象进程中的存根代码(stub)通信,存根代码再调用组件对象成员函数。函数返回的顺序刚好相反。在这个交互过程中,可以看到,客户仍然在调用同一进程内的组件对象,而组件对象也被同一进程内的客户调用,从客户和组件对象两个角度丝毫感觉不到进程的边界,所有跨进程的操作完全由代理对象和存根代码包揽了。

8、列集(marshaling)与散集(unmarshaling)

列集是指客户进程可以透明地调用另一进程中的对象成员函数的一种参数处理机制。

代理对象用列集手段处理成员函数的参数,通过列集处理后得到一个数据包(数据流),然后通过一种跨进程的数据传输方法,比如共享内存方法,甚至是网络协议等,当数据包传输到对象进程后,存根代码用散集(unmarshaling,列集的反过程)的方法把数据包参数解译出来,再用这些参数去调用组件对象;当组件对象成员函数返回后,存根代码又把返回值和输出参数列集成新的数据包,并把数据包传到客户进程中,代理对象接收到数据包后,把数据包解译出来再返回给客户函数,从而完成一次调用。

9、连接

连接是指客户进程与组件进程的一种依赖关系,简单地说,客户程序的一个有效接口指针就代表了一个连接。

连接是在函数调用的过程中产生的,最常使用的QueryInterface就是一个很好的例子。

连接是跨进程通信的基础,新的连接本身也是在其他连接的调用过程中产生的。

10、不同参数的列集处理

32位整数只要把4字节的数据顺序装到数据包中或者从数据包中去出来即可;字符串或者结构类型的数据列集过程也可以按此方法处理。

对指针的列集处理过程是:列集时,把指针所指的数据装到数据包中;散集时,在进程中分配一块内存,把数据包中的数据拷贝到内存中,所得内存的地址即为散集的结果。

如果函数的参数中包含了指向接口的指针,则情形要复杂得多。接口的列集包含了代理对象和存根代码的创建过程,实际上接口指针的列集过程也包括了连接的创建过程。

11、列集过程的两种实现方式:

自定义列集法(custom marshaling),也称为基本列集法(basic marshaling architecture)。其列集过程完全由对象自身控制,对象指定其代理对象的CLSID,代理对象控制了其所有接口的列集过程,包括接口参数的列集和散集,以及代理对象和存根代码之间的跨进程通信过程。

标准列集法(standard marshaling),是由COM提供缺省的代理对象和存根代码,因为列集过程涉及到操作系统的一些复杂特性的编程,如共享内存操作或其他跨进程数据传输机制,甚至通过网络协议传输数据,所以COM提供了缺省的代理和存根代码以及一套标准的列集方法,可以处理常用数据类型的列集和散集,包括指针类型和接口指针类型。

标准列集法的原理以及其列集过程与自定义列集法完全一致,事实上标准列集法是自定义列集法的一个特例。但两者有一个基本的不同:自定义列集法其列集过程完全由对象自身控制,所以它以整个对象为列集单位,即对象指定的代理对象和存根代码必须处理对象支持的所有接口;而标准列集法使用COM提供的标准代理对象和存根代码,实际上该代理对象和存根代码只是列集过程的管理器,因此,标准列集法是以接口为列集单位,COM提供的很多标准接口,其列集过程已经由COM 库提供了,程序员只需要提供自定义接口的列集代码即可。

12、标准列集的实现

COM已经提供了缺省的代理对象、存根管理器以及RPC通道,我们只需要实现每个接口的代理/存根模块。一旦系统中安装了某个接口的代

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号