简介
- 组件对象模型(COM)是一个独立于平台的分布式面向对象的系统,用于创建可交互的二进制软件组件
- 是OLE(复合文档),ActiveX(Internet组件)等的基础技术
- 不是一种语言,而是一种标准,用于创建运行时进行交互的可重用的软件库,无须编译到应用程序中,即可使用COM库
跨平台软件重用的基本概念
- 组件间函数调用的二进制标准
- 将函数强类型化分组到接口中的设置
- 提供多态性、功能发现和对象生存期跟踪的基接口
- 唯一标识组件及其接口的机制
- 从部署创建组件实例的组件加载程序
具有多个共同工作的部分
- 提供符合 COM 规范的运行时环境的 主机系统
- 定义功能协定和实现接口的 组件 的 接口
- 向系统提供组件的 服务器,以及使用组件提供的功能的 客户端
- 跟踪将组件部署在本地和远程主机上的位置的 注册表
- 一种 服务控制管理器 ,用于查找本地和远程主机上的组件,并将服务器连接到客户端
- 一种 结构化存储 协议,用于定义如何在主机的文件系统上导航文件的内容
概率
接口
- 成员函数的集合,面向对象中接口类
IID
- 每个接口都有其自己的唯一接口标识符 IID, IID 是全局唯一标识符 (GUID) , IID只会对应一个接口
COM类
- COM类可以创建实现了多个 接口(接口类)
CLSID
- 每个com 类都有一个CLSID,在windows 上com 类 的实现在 dll 或者 exe 上
映射关系
- COM 维护系统上安装的 COM 对象的所有 Clsid 的注册数据库
- 注册数据库是每个 CLSID 之间的映射,以及承载相应类的 DLL 或 EXE 的位置
- 每当调用方想要创建 COM 类的实例时,COM 都将查询此数据库。 调用方只需了解用于请求类的新实例的 CLSID
客户端/服务器
- COM 对象及其调用方之间的交互建模为客户端/服务器关系
- 客户端是向系统请求 COM 对象的调用方
- 服务器是包含向客户端提供服务的 COM 对象的模块
CoCreateInstance
- COM框架提供的接口,用于获取想要的对象指针
- COM 客户端是向系统传递 CLSID 以请求 COM 对象实例的任何调用方
1 2 3 4 5 |
HRESULT _stdcall CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv); |
1 2 3 4 5 |
ComPtr<IGraphBuilder> graph; HRESULT hr; hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IFilterGraph, (void**)&graph); |
- 参数
- 待创建组件的CLSID。 用于找到对应COM 类,和所在的DLL 或者 exe
- 用于聚合组件
- dwClsContext的作用是限定所创建的组件的执行上下文
- iid为组件上待使用的接口的iid。也就是 接口类对应的IID
IUnKnown
- IUnknown是指COM标准接口。所有COM接口都继承IUnKnown
- 作用
- IUnknown::QueryInterface负责得到该组件的其他接口的指针
- IUnknown::AddRef/Release负责管理该组件的生存期,但有人使用该组件时,保证该组件不会被意外删除;再没人使用该组件时,保证该组件被自动删除
- 原理
- IUnknown 中的方法使应用程序能够查询组件上的接口并管理组件的引用计数
注册
- 使用regsvr32注册
- 注册后,组件信息存放到了注册表
\HKEY_CLASSES_ROOT\CLSID
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ C++标准库_cfenv02/14
- ♥ STL_queue06/07
- ♥ 关于多字节和宽字节二12/04
- ♥ breakpad记述:Windows07/27
- ♥ Soui七06/02
- ♥ Windows 核心编程 _ 创建&&终止线程07/02