windows - COM 组件介绍

COM 简介

Microsoft 组件对象模型 (COM) 是一个独立于平台的分布式面向对象的系统,用于创建可交互的二进制软件组件。 COM 是 Microsoft 的 OLE (复合文档) 、ActiveX (Internet 组件) 等的基础技术。
若要了解 COM (所有基于 COM 的技术) ,必须了解它不是面向对象的语言,而是一种标准。 用于创建在运行时进行交互的可重用的软件库。 无需将其编译到应用程序中,即可使用 COM 库。 COM 是许多 Microsoft 产品和技术的基础,例如 Windows Media Player 和 Windows 服务器。

COM 定义适用于许多操作系统和硬件平台的二进制标准。 对于网络计算,COM 定义了标准线路格式和协议,以便在不同硬件平台上运行的对象之间进行交互。 COM 与实现语言无关,这意味着你可以使用不同的编程语言(如 c + + 和 .NET Framework 中的编程语言)来创建 COM 库。

COM 规范提供启用跨平台软件重用的所有基本概念:

  • 组件间函数调用的二进制标准。
  • 将函数强类型化分组到接口中的设置。
  • 提供多态性、功能发现和对象生存期跟踪的基接口。
  • 唯一标识组件及其接口的机制。
  • 从部署创建组件实例的组件加载程序。

COM 具有多个共同工作的部分,可让你创建从可重用组件生成的应用程序:

  • 提供符合 COM 规范的运行时环境的 主机系统 。
  • 定义功能协定和实现接口的 组件 的 接口。
  • 向系统提供组件的 服务器,以及使用组件提供的功能的 客户端。
  • 跟踪将组件部署在本地和远程主机上的位置的 注册表 。
  • 一种 服务控制管理器 ,用于查找本地和远程主机上的组件,并将服务器连接到客户端。
  • 一种 结构化存储 协议,用于定义如何在主机的文件系统上导航文件的内容。
    跨主机和平台启用代码重用是 COM 的核心。 可重复使用的接口实现称为 " 组件"、" 组件对象" 或 " COM 对象"。 组件实现一个或多个 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 对象实例的任何调用方。 创建实例的最简单方法就是调用 COM 函数 CoCreateInstance。

这是一段dshow 创建graph 的代码

	ComPtr<IGraphBuilder> graph;
	HRESULT hr;

	hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
			      IID_IFilterGraph, (void **)&graph);

看一下

HRESULT _stdcall  CoCreateInstance(REFCLSID rclsid,

                        LPUNKNOWN pUnkOuter,

                        DWORD dwClsContext,

                        REFIID riid,

                        LPVOID * ppv);

第一个参数:待创建组件的CLSID。 用于找到对应COM 类,和所在的DLL 或者 exe。

第二个参数:用于聚合组件。

第三个参数:dwClsContext的作用是限定所创建的组件的执行上下文。

第四个参数:iid为组件上待使用的接口的iid。也就是 接口类对应的IID

CoCreateInstance 将在最后一个参数中返回此接口的指针。通过将一个IID传给CoCreateInstance,客户将无需在创建组件之后去调用 其QueryInterface函数。

HRESULT CoCreateInstance(const CLSID& clsid,
                IUnknown* punkonwnDuter,
                DWORD dwClsContext,
                const IID& iid,
                void** ppv)
{
    // Set the out paameter to NULL
    *ppv = NULL;

    // 首先根据clsid获得COM类的工厂类
    IClassFactory* pIFactory = NULL;
    HRESULT hr = CoGetClassObject(clsid,
                        dwClsContext,
                        NULL,
                        IID_IClassFactory,
                        (void**)&pIFactory);
    if (SUCCEEDED(hr))
    {
        // 使用工厂类,传入接口 IID, 来创建接口对象
        hr = pIFactory->CreateInstance(punkonwnDuter, iid, ppv);
        pIFactory->Release()();
    }
    return hr;
}

IUnKnown 接口

IUnknown是指COM标准接口。所有COM接口都继承IUnKnown。
他负责两项工作:

  • IUnknown::QueryInterface负责得到该组件的其他接口的指针
  • IUnknown::AddRef/Release负责管理该组件的生存期,但有人使用该组件时,保证该组件不会被意外删除;再没人使用该组件时,保证该组件被自动删除

IUnknown 的工作原理

IUnknown 中的方法使应用程序能够查询组件上的接口并管理组件的引用计数。

引用计数

引用计数是一个内部变量,在 AddRef 方法中递增,并在 Release 方法中减少。 基类管理引用计数,并同步对多个线程中的引用计数的访问。

接口查询

查询接口也很简单。 调用方传递两个参数:接口标识符 (IID) ,以及指针的地址。 如果组件支持请求的接口,它会将指针设置为接口,并递增其自己的引用计数,并返回 S _ OK。 否则,它会将指针设置为 NULL ,并返回 E _ NOINTERFACE。 以下伪代码显示了 QueryInterface 方法的一般轮廓。 下一节中描述的组件聚合带来了一些额外的复杂性。

第一点:说简单一点就是,dynamic_cast。查询 CoCreateInstance 创建出来的对象,是否可以转换成底层接口,其实就是c++ 中 dynamic_cast,同时增加一个引用计数而已。如果是纯c++ 的情况,应该就不需要这个接口了。

第二点:也是工厂模式,根据riid 创建 对象

STDMETHODIMP CapturePin::QueryInterface(REFIID riid, void **ppv)
{
	if (riid == IID_IUnknown) {
		AddRef();
		*ppv = this;
	} else if (riid == IID_IPin) {
		AddRef();
		*ppv = (IPin *)this;
	} else if (riid == IID_IMemInputPin) {
		AddRef();
		*ppv = (IMemInputPin *)this;
	} else {
		*ppv = nullptr;
		return E_NOINTERFACE;
	}

	return NOERROR;
}
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: COMComponent Object Model)是微软公司开发的一种面向对象的组件对象模型。它是一种可用于编写和调用应用程序的平台和语言无关的技术,具有广泛的应用。COM可以使不同的软件组件相互通信和交互,实现代码的复用和模块化开发。COM技术内幕-微软组件对象模型 PDF是一本关于COM技术的书籍,通过介绍COM技术的原理、架构和编程接口,帮助读者深入理解COM技术的内部工作原理和应用方法。 COM技术内幕-微软组件对象模型 PDF可以帮助读者了解COM的基本概念和核心概念,如COM对象、接口、类工厂等。它还介绍COM对象的生命周期和内存管理,以及如何使用COM接口进行对象之间的通信和交互。此外,该书还讲解了COM的线程模型、注册表、组件的版本管理和卸载等相关内容。 通过阅读COM技术内幕-微软组件对象模型 PDF,读者可以深入了解COM技术的实现细节和应用技巧,掌握COM的高级编程技巧,提高软件开发和设计的效率。这本书适合有一定编程基础的读者阅读,特别是那些对COM技术感兴趣并希望进一步学习和应用的人员。 总之,COM技术内幕-微软组件对象模型 PDF是一本关于COM技术的详细指南和参考书,它可以帮助读者深入理解COM技术的内部工作原理和应用方法,提高软件开发和设计的技能水平。 ### 回答2: COM技术内幕-微软组件对象模型(Component Object Model,简称COM)是一种面向对象的软件组件模型,由微软公司开发,用于实现软件组件的互操作性。它在Windows操作系统中被广泛应用,为开发人员提供了一种在不同平台和编程语言之间交互的标准接口。 COM技术内幕-微软组件对象模型的PDF是一本介绍COM技术的相关文档。它详细讲解了COM的原理、架构、编程模型和相关的API,介绍COM组件的开发、注册和部署等方面的知识。 这本PDF不仅适合初学者学习COM技术,也适合有一定基础的开发人员进一步深入了解COM的内部实现和高级特性。它可以帮助开发人员理解COM组件的生命周期、接口的多态性、对象模型的设计原则等重要概念。 此外,这本PDF还介绍COM组件与.NET和Java等现代开发平台之间的互操作性。它解释了如何在COM组件和这些平台之间进行数据交换、方法调用等操作,为开发人员提供了实现跨平台开发的方法和技巧。 总之,COM技术内幕-微软组件对象模型的PDF对于想要深入理解和应用COM技术的开发人员来说是一本很有价值的参考资料。通过学习这本PDF,开发人员可以更加高效地开发和管理COM组件,提高软件的可复用性和扩展性。 ### 回答3: COMComponent Object Model)是微软公司开发的一种软件组件技术,用于实现软件的组件化开发和复用。COM技术内幕-微软组件对象模型(COM Internals - Microsoft Component Object Model)是一本介绍COM技术的PDF文件。 该PDF文件主要讲解了COM的原理、架构和用法。首先,它介绍COM的产生背景和发展历程,让读者了解COM的起源和重要性。然后,它详细解释了COM的基本原理和核心概念,如COM对象、接口、类工厂等,帮助读者理解COM组件的结构和运作方式。 接着,该文件介绍COM的编程模型,即如何使用COM来开发软件。它详细解释了COM的接口定义语言(IDL)和对象创建的过程,以及如何在不同编程语言(如C++、C#等)中使用COM进行开发。 此外,该PDF文件还讨论了COM的生命周期管理、线程安全性和版本控制等重要概念。它指导开发者如何正确地创建、使用和释放COM对象,并提供了一些常见问题的解决方法。 最后,该文件还介绍COM的扩展技术和相关标准,如COM+、DCOMCOM浏览器等。它展示了COM在分布式系统、Web服务和企业应用中的应用场景,帮助读者拓展对COM技术的应用范围。 总之,COM技术内幕-微软组件对象模型是一本全面介绍COM技术的PDF文件,适合想要深入了解并应用COM技术的开发者和技术爱好者阅读。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值