COM组件设计与使用——概述

COM组件的设计:

COM组件—— 即按照COM规范编写的组件程序,它既可以是dll也可以是exe。
 
下面以dll组件开发为例进行说明 假设组件名字为 test.dll
        首先,根据功能需要我们要设计一些类,这些类叫做COM对象类,每个COM对象类需要一些接口来提供类的功能。我们要为每个COM对象类,提供一个CLSID,为每一个类的接口提供一个IID,用来作为COM对象类和接口的唯一标识。这个唯一标示可以使用Visual C++ 提供的工具 UUIDGen和 GUIDGen来生成。
 
        第二,按照COM规范,我们要根据COM对象类的个数设计相应数目的COM对象类厂。COM规范规定类厂对象负责创建对应的COM对象。
        
        第三,COM规范使用注册表管理COM对象,因此需要在注册表中写入COM对象的CLSID来管理COM对象。我们有两种方式向注册表写信息: 第一种,编写一个注册表文件,然后在RegEdit种引入,采用这种方式的组件程序叫做非自注册组件程序;第二种,在test.dll种添加导出函数 DllRegisterServer()和DllUnregisterServer() 在命令行下使用RegSvr32 c:/test.dll来注册组件,这种方式实现的test.dll称为自注册组件程序。
 
    第四,添加导出函数 DllGetClassObject(const CLSID& clsid, const IID& iid, void **ppv)
该函数被COM库调用负责创建类厂对象,并返回类厂接口IClassFactory指针。
 
    至此一个COM组件所需要的基本框架就构成了,剩下的事情就是完成组件的功能了。
 
COM组件的使用:
    首先, 声明外部变量,声明test.dll 所使用的IID
    第二, 初始化com库
    第三, 调用
CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter,
                    DWORD dwClsContext, REFIID riid, LPVOID FAR* ppv); 创建COM对象并返回IUnknown接口指针。
    第四,通过IUnknown接口的QueryInterface函数来得到要使用的接口指针,接下来就可以使用COM对象提供的功能了。
    
     因为COM规范规定COM对象的生存周期是通过IUnknown接口提供的功能来实现的,每当通过IUnknown接口的QueryInterface函数来得到要使用的接口指针后,COM对象的使用计数器就加1。采用这种方式可以更好的管理COM接口所有的接口都可以通过IUnknown接口得到。当然,不使用IUnknown接口也可以直接得到其他接口指针,但这么做不符合COM规范,并且对COM对象生存周期的控制也比较麻烦。

你可能感兴趣的:(COM组件设计与使用——概述)