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:进程外组件