COM :创建和使用组件标准

(DLL:COM的一种实现)

任何程序都由若干组件构成

      

组件:实现接口功能

       

组件特点:(1)动态链接 (2)隐藏(内部)实现(实现语言,实现逻辑)

      

COM最终目的:动态替换组件

    

COM库(COM Library):支持组件管理

     

外部程序/组件 只通过接口访问组件

    

外部程序/组件只能通过查询接口(QueryInterface)了解组件支持的接口

     

查询接口(QueryInterface)规则:

(1)(同一组件)总是返回同一IUnknow 指针

(2)外部可获得曾获得接口

(3)外部可再次获得已获得接口

(4)外部可返回起始接口

(5)可从任意接口获得已获得接口

              

接口引用计数规则:

(1)返回(接口指针)之前AddRef:返回接口指针的函数内部

(2)(接口指针)赋值之后AddRef

(3)使用完(接口)之后Release

    

组件使用过程 

(1)创建组件对象(CreateInstance):返回IUnknow指针

(2)通过IUnknow指针查询组件中接口(QueryInterface):根据接口ID(IID)返回接口指针

       

——————————————————————————————————–

COM的实现 : DLL

   

win32使用(只含纯虚函数的)结构体(struct)表示接口(interface)

#define interface struct

    

(通过)接口指针 调用接口函数:多态调用 实现函数(实现对象+虚表 / 静态实现函数)

      

多态:按同一种方式处理不同的对象

    

接口定义了一种内存结构,实现类继承这个结构

接口定义了实现类的虚表结构

     

接口继承接口, 类实现接口

     

所有接口 继承 IUnknow接口(查询接口+控制生命周期)

    interface IUnknow {

        virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppInterface) = 0;//查询组件接口

        virtual ULONG __stdcall AddRef() = 0;

        virtual ULONG __stdcall Release() = 0;

    }

一个组件只有一个IUnknow接口

       

通过类工厂创建组件对象,查询接口

CoCreateInstance (const CLSID& clsid, IUnknown*, DWORD, const IID& iid, void** ppInterface)

(1)CoGetClassObject (const CLSID& clsid, DWORD, COSERVERINFO*, IID_IClassFactory , void** ppInterface)

   创建类工厂对象      获取类工厂接口(IClassFactory)

(2)pIClassFactory->CreateInstance (IUnknown*, const IID&, void** ppInterface);

    创建组件对象,查询接口

       

DLL:进程内组件

EXE:进程外组件