COM库
组件的对象和接口模型给用户提供了一种构建组件的规范,用户利用这种规范来创建自己的组件,为了协助用户更有效率地创建组件,MS操作平台提供了有关COM的一些列代码。
COM库实现了很多功能,用户通过调用COM库的函数来完成组件的相关操作。一般用户创建一个组件对象,进而调用组件的接口成员函数,最后释放组件对象,整个过程中都要用到COM库。
调用CoInitialize函数初始化COM库,然后在注册表中,COM库根据组件名称查找组件对象标识符CLSID。根据获得CLSID,COM库函数CoGetClassObject()创建对象的类厂。进而由类厂完成组件对象的创建,并返回对象的指针。COM库使用CoUninitialize()函数释放资源。
进程外组件
COM采用本地过程调用(LPC)和远程过程调用的方法进行进程之间的通信,其中LPC用于在同一机器上的不同进程之间进行通信,而RPC用于在不同的机器上的进行之间进行通信。
例如:应用A调用应用B的服务f
实际上应用A调用的系统模块DLL,在这里我们把该DLL称为存根模块,因为它是动态链接库模块,所以这个调用是直接进行的,在存根DLL中,它把应用的请求再通过LPC的方式调用到了进程B中的服务f,当f完成服务后,它也通过LPC把结果信息返回给存根DLL,最后由存根DLL把结果返回给A。
即:应用A向存根DLL发出调用B的服务f,由存根DLL调用LPC和进程B完成调用操作。A<- ->存根DLL;存根DLL<-->LPC<-->进程B。存根DLL和LPC以及进程B之间的操作对A来说是透明的,A只需要调用存根DLL就行了,实际的调用操作都是存根DLL完成的。
客户程序和进程外组件之间的调用关系:
客户程序只与同一进程中的代理(proxy)DLL【代理对象是代理DLL中代理对象】打交道,组件程序只与同一进程中的存根DLL打交道,LPC调用只在代理对象和存根DLL之间进行,当客户程序需要调用组件提供的功能服务时。
代理DLL和存根DLL除了完成LPC调用之外,它还需要对参数和返回值进行翻译和传递,客户程序调用的参数,首先经过代理DLL的处理,它把参数以及其他的一些调用信息组装成一个数据包传递给组件进程,这个过程成为参数列集;组件进程接收到数据包后,要进行解包操作,把参数信息提取出来,这个过程称为散集,然后再进行实际的接口功能调用。返回也要进行类似的操作。