一、 COM介绍
COM:组件对象模型,提供了组建之间的接口标准。
COM组件,COM对象和COM接口的关系:一个COM组件可以包括多个COM对象,每个COM对象可以实现多个COM接口。
COM对象和接口:COM对象类似于类的一个实例,是一组相关数据和功能组合在一起的一个定义。接口是一组逻辑上相关的函数集合,其函数也称为接口成员函数,接口以“I”开头,如“IUnknown”。对象通过接口成员函数为客户提供各种形式的服务。对象对于客户来讲只是一组接口。
每一个接口有一个128位的全局标示符GUID来标识。每个对象也用一个128位的全局标识符来CLSID来标识。COM对象至少实现一个接口,当用CLSID创建一个COM对象时,得到的是一个指向对象某个接口的指针,对象对于客户来说只是一组接口。
COM的特性:语言无关性、进程透明性和可重用机制。
二、 COM对象和接口
COM对象:类似于类的概念,也包括属性(状态)和方法(操作),封装是COM对象的基本特征。CLSID来创建和初始化COM对象,用整数字来表示,如:{54BF6567-1007-11D1 -4445535400},基本结构是:DWORD,WORD,WORD,BYTE[8]。有API函数:HRESULT CoCreateGuid(GUID* pGuid);
COM接口:API函数非常多的时候非常不方便,API函数需要标准化,COM接口弥补了不足。接口定义类似于类中的虚函数,接口指针指向另外一个指针,这个指针指向一组函数,类似于虚函数表。在接口函数中,字符串变量必须用Unicode字符指针,COM采用了_stdcall或pascal的调用习惯。接口有接口描述语言IDL,通过MIDL工具可以转换为.h文件。
接口函数表称为虚函数表。
COM接口的一些特点:二进制特性、接口不变性、继承性和多态性。
IUnknown接口:每一个COM接口都必须从IUnknown接口继承过来,因为此接口提供了两个重要的特性:生存期控制和接口查询。通过引入技术的方法有效地控制对象的生存周期,通过接口查询来完成接口之间指针的转换。包括了三个成员函数,QueryInterface,Addref,Release。
三、 COM实现
我们可以把动态链接库作为组件程序的一种实现方式,这时候称之为进程内组件,另外一种方式是单独的exe程序,称之为进程外组件。
对于进程内组件,编制DLL程序,约定每个函数用extern “C”以及_stdcall来约定。可以用三个函数,LoadLibrary,GetProcAddress,FreeLibrary来操作DLL。
进程外组件则需要解决两个问题,一个进程如何调用另外一个进程的函数,参数如何从一个进程传递到另外一个进程中。COM采用了本地过程调用LPC,和远程过程调用RPC的方法进行进程之间的的通信,通过代理DLL和存根DLL实现。
通过注册表管理COM对象:客户通过GUID来创建COM对象,通过COM库来完成COM对象的创建工作,COM库通过系统注册表所提供的信息进行组件的创建工作。组件在注册表中需要完成注册,实现COM库时必须同时定义出注册表的结构。
在注册表中的HKEY_CLASSES_ROOT中的CLSID子键,列出了当前及其上所有组件的信息。组件的注册分为自注册组件程序和非自注册组件程序。
类厂:COM库的创建函数根据注册表的信息并调用组件程序的入口函数来创建组件对象,标准的入口函数是DllGetObjectClass。这个函数是组件程序实现的引入函数,负责创建类厂指针对象,得到类厂指针对象后可以调用CreateInstance来创建COM对象。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chshplp2008/archive/2009/11/02/4758314.aspx